linux socket非阻塞之 send 和sendto函数

本文介绍了Linux下TCP的send和UDP的sendto函数在非阻塞模式下的使用。当返回值小于0时,根据errno判断情况:EAGAIN或EWOULDBLOCK表示缓冲区满,可等待通知;EINTR表示被中断,可继续尝试;其他错误码则应关闭socket。返回值大于等于0但不等于请求长度时,需继续发送剩余数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1,函数原型

#include <sys/socket.h>

ssize_t send(int sockfd, const void *buff, size_t nbytes, int flags);
ssize_t sendto(int sock, const void *buf, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);

TCP使用send,UDP使用sendto,需要指定发送数据的ip和端口号。

返回值是实际发送的字符数,因为我们知道要发送的总长度,所以,如果没有发送完,我们可以继续发送。

  • < 0,当返回值当返回值为 -1   时, 我们需要判断  errno:

     A,如果errno为  EAGAINE   或 EWOULDBLOCK ,表示当前缓冲区写满,可以继续写,或者等待epoll或select的后 续    通    知,一旦有缓 冲 区,就会触发写操作,这个也是经常利用的一个特性。

     B,如果errno为EINTR  ,表示被中断了,可以继续写,或者等待epoll或select的后续通知。

     C,如果errno不为EAGAINE或EWOULDBLOCK或EINTR,此时真的出错,此时应该close(sockfd)。

  • >= 0 且不等于要求发送的长度,应该继续send,如果等于要求发送的长度,发送完毕

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值