18

使用 TCP 套接字时,C 函数是否有可能send返回零?手册页只是说它将返回发送的字节数,但我不确定它是否会在无法发送任何数据时返回 -1。

4

5 回答 5

19

我很确定,虽然记忆在时间的迷雾中很深,但我之前已经看到它返回零,在另一端没有跟上的大量数据传输的情况下。

在这种情况下,从内存中,远程 TCP 堆栈缓冲区已填满,堆栈已通知本地端它要延迟,直到一些空间被清除并且本地缓冲区也已填满。

那时,从技术上讲,这不是错误(因此没有返回 -1),但本地堆栈不能接受任何数据。

我不完全确定现在是这种情况,因为当前的 Posix 标准似乎表明它只会在这种情况下阻塞(或者如果它设置为非阻塞则失败)。

但是,我怀疑这是一个有争议的问题。您确实有可能它返回的字节数少于您请求发送的字节数,因此您应该有代码来处理它。

而且,由于处理“比您要求的少一个”与处理“零字节”的逻辑几乎相同,因此您不妨假设它可以返回零。

于 2010-06-21T03:56:17.373 回答
4

好吧,总是存在您传入零作为要发送的字节数的情况......在这种情况下,“返回发送的字节数”将表明它应该返回零字节。

无论如何,最好还是正确处理归零的情况;它不会伤害,它可能会有所帮助。

于 2010-06-21T03:46:32.077 回答
3

这个问题的答案很可能取决于实现,因此会因操作系统而异。

当您请求传输 0 字节时,预期为 0 的一种情况。

于 2010-06-21T03:47:49.727 回答
2

BSD手册页指出:

如果套接字上没有可用的消息空间来保存要传输的消息,则 send() 通常会阻塞,除非套接字已置于非阻塞 I/O 模式。

Posix 规范更进一步,并指出在阻塞模式下,所有数据都被传输,除非发生中断。

在这两种情况下,除非提供的计数为零,否则不能返回零。

于 2016-02-28T02:28:14.313 回答
0

我现在确实观察到类型插座send(2)上的零返回。AF_UNIX

是的,这是由于size零值领域。

所以,JFYI。

于 2018-10-17T15:18:06.093 回答