【问题标题】:What factors will lead to linux send() function return 0?什么因素会导致linux send()函数返回0?
【发布时间】:2014-03-25 15:22:09
【问题描述】:

我筛选了我的 linux 服务器程序日志,发现一些 send() 函数调用返回 0。我想知道它是怎么发生的?除了在另一端跟不上的大量数据传输之外,还有哪些因素会导致这种情况.

【问题讨论】:

标签: linux tcp


【解决方案1】:

除了在另一端跟不上的大量数据传输之外,还有哪些因素会导致这种情况。

这根本不是因素之一。

我知道这通常是由于另一端没有跟上的大量数据传输造成的。

不,不是。这只发生在非阻塞模式下,它会导致 send() 返回 -1 并将 'errno' 设置为 EAGAIN/EWOULDBLOCK.

你错了。

当且仅当您提供零长度时,send() 才会返回零。

这就是 man 页面所说的,并且从大约 1983 年开始就一直在说,它是 Posix 和 Winsock 规范的强制要求。

【讨论】:

  • @lojunren 这只是 SO 的另一个答案,它没有比这个更高的地位。我依赖于它在 man 页面中所说的内容,实际上是 Posix 规范。任何其他行为都是错误。
  • send() 函数返回 0 不代表发生错误。可能是 TCP 的基本特性流控制引起的。我想知道 send() 函数返回 0 的唯一原因通过TCP流控机制?没有其他可能吗?
  • @lojunren send() 返回零意味着您提供了零长度。时期。不是错误,我没有另外说明。返回 -1 表示错误。 TCP 流控制将导致阻塞模式send() 阻塞,或非阻塞模式send() 返回-1/EAGAIN/EWOULDBLOCK. 这就是Posix 规定的;这就是 man 页面所说的;这就是我上面所说的。这也与我 24 年来所看到的一致。我还为您提供了send() 可以返回零的唯一可能性。
  • ssize_t send(int sockfd, const void *buf, size_t len, int flags);实际上,在调用 send() 函数之前,我转储了需要发送到另一端的参数 2。并且我还将len记录到了我的日志文件中。日志表明我传入的参数3 len不是0,参数2 buf不是NULL。
猜你喜欢
  • 2012-04-17
  • 1970-01-01
  • 2012-08-13
  • 2016-10-09
  • 1970-01-01
  • 1970-01-01
  • 2015-06-02
  • 2023-02-11
相关资源
最近更新 更多