【发布时间】:2014-03-25 15:22:09
【问题描述】:
我筛选了我的 linux 服务器程序日志,发现一些 send() 函数调用返回 0。我想知道它是怎么发生的?除了在另一端跟不上的大量数据传输之外,还有哪些因素会导致这种情况.
【问题讨论】:
-
阅读 send(2) 手册页。
我筛选了我的 linux 服务器程序日志,发现一些 send() 函数调用返回 0。我想知道它是怎么发生的?除了在另一端跟不上的大量数据传输之外,还有哪些因素会导致这种情况.
【问题讨论】:
除了在另一端跟不上的大量数据传输之外,还有哪些因素会导致这种情况。
这根本不是因素之一。
我知道这通常是由于另一端没有跟上的大量数据传输造成的。
不,不是。这只发生在非阻塞模式下,它会导致 send() 返回 -1 并将 'errno' 设置为 EAGAIN/EWOULDBLOCK.
你错了。
当且仅当您提供零长度时,send() 才会返回零。
这就是 man 页面所说的,并且从大约 1983 年开始就一直在说,它是 Posix 和 Winsock 规范的强制要求。
【讨论】:
send() 返回零意味着您提供了零长度。时期。不是错误,我没有另外说明。返回 -1 表示错误。 TCP 流控制将导致阻塞模式send() 阻塞,或非阻塞模式send() 返回-1/EAGAIN/EWOULDBLOCK. 这就是Posix 规定的;这就是 man 页面所说的;这就是我上面所说的。这也与我 24 年来所看到的一致。我还为您提供了send() 可以返回零的唯一可能性。