使用 TCP 套接字时,C 函数是否有可能send
返回零?手册页只是说它将返回发送的字节数,但我不确定它是否会在无法发送任何数据时返回 -1。
5 回答
我很确定,虽然记忆在时间的迷雾中很深,但我之前已经看到它返回零,在另一端没有跟上的大量数据传输的情况下。
在这种情况下,从内存中,远程 TCP 堆栈缓冲区已填满,堆栈已通知本地端它要延迟,直到一些空间被清除并且本地缓冲区也已填满。
那时,从技术上讲,这不是错误(因此没有返回 -1),但本地堆栈不能接受任何数据。
我不完全确定现在是这种情况,因为当前的 Posix 标准似乎表明它只会在这种情况下阻塞(或者如果它设置为非阻塞则失败)。
但是,我怀疑这是一个有争议的问题。您确实有可能它返回的字节数少于您请求发送的字节数,因此您应该有代码来处理它。
而且,由于处理“比您要求的少一个”与处理“零字节”的逻辑几乎相同,因此您不妨假设它可以返回零。
好吧,总是存在您传入零作为要发送的字节数的情况......在这种情况下,“返回发送的字节数”将表明它应该返回零字节。
无论如何,最好还是正确处理归零的情况;它不会伤害,它可能会有所帮助。
这个问题的答案很可能取决于实现,因此会因操作系统而异。
当您请求传输 0 字节时,预期为 0 的一种情况。
BSD手册页指出:
如果套接字上没有可用的消息空间来保存要传输的消息,则 send() 通常会阻塞,除非套接字已置于非阻塞 I/O 模式。
Posix 规范更进一步,并指出在阻塞模式下,所有数据都被传输,除非发生中断。
在这两种情况下,除非提供的计数为零,否则不能返回零。
我现在确实观察到类型插座send(2)
上的零返回。AF_UNIX
是的,这是由于size
零值领域。
所以,JFYI。