send函数返回EAGAIN问题

树先生 2010-01-10 10:22:52
在使用socket时 send()返回的是成功copy到socket缓冲区的数据大小
如果返回-1的话 我查了一下 好像是socket缓冲区剩余空间大小小于要发送的数据长度 也可以说缓冲区满了
那如果我这边缓冲区没满 而接收方的缓冲区满了 send()应该返回什么呢
我这边返回的异常信息是EAGAIN

请大家帮忙指点!
...全文
1439 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
cattycat 2010-01-10
  • 打赏
  • 举报
回复
接收数据从tcp的缓冲拷到socket的缓冲区,你的socket缓冲区大小要大于接收的数据长度才能接收成功。你可以试一下接收缓冲小于发送的数据大小,看返回什么结果。
cattycat 2010-01-10
  • 打赏
  • 举报
回复
send底层的缓冲区是tcp协议负责处理的,一般不用处理,send成功的话返回发送的字节数,tcp实现的重传不需要你来显示调用send。
  • 打赏
  • 举报
回复
换句话说, send只要数据从自己缓冲区发出去了,它就返回发送的字节数,认为成功,至于保证对方收到,是tcp协议决定,重发也用不上你重新来个send.

  • 打赏
  • 举报
回复
[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的缓冲区应该有同步控制的

69,364

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧