社区
C语言
帖子详情
send函数返回EAGAIN问题
树先生
2010-01-10 10:22:52
在使用socket时 send()返回的是成功copy到socket缓冲区的数据大小
如果返回-1的话 我查了一下 好像是socket缓冲区剩余空间大小小于要发送的数据长度 也可以说缓冲区满了
那如果我这边缓冲区没满 而接收方的缓冲区满了 send()应该返回什么呢
我这边返回的异常信息是EAGAIN
请大家帮忙指点!
...全文
1469
5
打赏
收藏
send函数返回EAGAIN问题
在使用socket时 send()返回的是成功copy到socket缓冲区的数据大小 如果返回-1的话 我查了一下 好像是socket缓冲区剩余空间大小小于要发送的数据长度 也可以说缓冲区满了 那如果我这边缓冲区没满 而接收方的缓冲区满了 send()应该返回什么呢 我这边返回的异常信息是EAGAIN 请大家帮忙指点!
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
5 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
cattycat
2010-01-10
打赏
举报
回复
接收数据从tcp的缓冲拷到socket的缓冲区,你的socket缓冲区大小要大于接收的数据长度才能接收成功。你可以试一下接收缓冲小于发送的数据大小,看返回什么结果。
cattycat
2010-01-10
打赏
举报
回复
send底层的缓冲区是tcp协议负责处理的,一般不用处理,send成功的话返回发送的字节数,tcp实现的重传不需要你来显示调用send。
猫已经找不回了
2010-01-10
打赏
举报
回复
换句话说, send只要数据从自己缓冲区发出去了,它就返回发送的字节数,认为成功,至于保证对方收到,是tcp协议决定,重发也用不上你重新来个send.
猫已经找不回了
2010-01-10
打赏
举报
回复
[Quote=引用楼主 xxrlily 的回复:]
在使用socket时 send()返回的是成功copy到socket缓冲区的数据大小
如果返回-1的话 我查了一下 好像是socket缓冲区剩余空间大小小于要发送的数据长度 也可以说缓冲区满了
那如果我这边缓冲区没满 而接收方的缓冲区满了 send()应该返回什么呢
我这边返回的异常信息是EAGAIN
请大家帮忙指点!
[/Quote]
1.你自己的缓冲区满了,会返回EAGAIN。
2.你的没满,对方的缓冲区满了,肯定不关你事,可能会发送不成功,但是协议栈提供的系统调用,只管数据成功从你的缓冲区发出去,之后人家因为缓冲区满收不到数据,tcp自己有重传机制(参考Tcp/ip详解卷1)。
http://hi.baidu.com/newnlcloud/blog/item/c251b835c88dbf315bb5f5fa.html
东大坡居士
2010-01-10
打赏
举报
回复
这个我感觉就不用考虑了吧,这个应该是接收方考虑的,接收方的缓冲区和send的缓冲区应该有同步控制的
EAAGAIN errno11
EAAGAIN errno11EAAGAIN errno11EAAGAIN errno11EAAGAIN errno11EAAGAIN errno11EAAGAIN errno11EAAGAIN errno11EAAGAIN errno11EAAGAIN errno11
Socket的
send
函数
在执行时报
EAGAIN
的错误
Socket的
send
函数
在执行时报
EAGAIN
的错误] 内容提要: 当客户通过Socket提供的
send
函数
发送大的数据包时,就可能
返回
一个EGGAIN的错误。该错误产生的原因是由于
send
函数
中的size变量大小超过了tcp_
send
space的值。tcp_
send
space定义了应用在调用
send
之前能够在kernel中缓存的数据量。当应用程序在socket中设置了O_
send
函数
何时
返回
send
分阻塞和非阻塞模式的! 1 在阻塞模式下,
send
函数
是将应用程序请求发送的数据拷贝到发送缓存中发送并得到接收端的确认后再
返回
2 在非阻塞模式下,
send
函数
仅仅是将数据拷贝到协议栈的缓存区而已,如果缓存区可用空间不够,则尽能力的拷贝,
返回
成功拷贝的大小;如缓存区可用空间为0,则
返回
-1,同时设置errno为
EAGAIN
. 但是此时这些数据并不一定马上被传到连接的另一端。如果协
关于
send
()
函数
及EAGIN错误的理解
基础知识:
send
(经socket传送数据) 相关
函数
send
to,
send
msg,recv,recvfrom,socket 表头文件 #include #include 定义
函数
int
send
(int s,const void * msg,int len,unsigned int falg
recv
函数
和
send
函数
返回
值错误处理
本文中分析的都是非阻塞态的socket错误代码,因为阻塞态也不会出现EWOULDBLOCK错误。 1、recv
函数
:
返回
值<0时并且(errno==EINTR||errno==EWOULDBLOCK||errno==
EAGAIN
)的情况下认为连接是正常的,继续接收。 当socket设置为非阻塞的时候,recv
返回
错误时才会有errno==EWOULDBLOCK||errno==
EAGAIN
两种情况; #define EWOULDBLOCK
EAGAIN
......
C语言
70,020
社区成员
243,264
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章