也谈谈Linux下recv函数的使用

很久之前做过的一个项目,已经在线上运行了很长一段时间了,前面几天有客户反映,某些功能使用起来出现了不正常的情况

找之前的设备,代码,搭建环境,烧写,调试,最后定位到是TCP和服务器收发数据出现了异常,一直在recv的循环出不来,导致其他业务暂时不能响应

这些看似复杂的现象其实就是一些很小的细节问题,是因为对recv函数的返回值以及errno没有做充分的考虑和判断导致,这里再温习一下

recv函数的原型如下:

ssize_t recv(int sockfd, void* buf, size_t len, int flags);

这里仅仅对该函数的返回值做一下深入分析和说明:

返回值大于0,表示实际读取到的字节数,这个很好理解;

返回值等于0,表示对端关闭(真关闭,会引发四次握手),如果我们读取到返回值为0,我们需要关闭我们的socket句柄;

返回值等于-1,这种情况需要根据errno来判断当前状态,

EAGAIN:套接字已标记为非阻塞,而接收操作被阻塞或者接收超时

EBADF:sock不是有效的描述词

ECONNREFUSE:远程主机阻绝网络连接

EFAULT:内存空间访问出错

EINTR:操作被信号中断

EINVAL:参数无效

ENOMEM:内存不足

ENOTCONN:与面向连接关联的套接字尚未被连接上

ENOTSOCK:sock索引的不是套接字 当返回值是0时,为正常关闭连接。

在设计

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

iowin888

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值