使用C TCP套接字,可以’发送’返回零吗?

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

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

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

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

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

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

并且,由于处理“零字节”的逻辑处理几乎与处理“零字节”相同,因此您可以假设它可以返回零。

好吧,总是存在这样的情况:你传递的零作为要发送的字节数……在这种情况下,“返回发送的字节数”表示它应该返回零字节。

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

对此的答案很可能取决于实现,因此根据操作系统而有所不同。

当您请求传输0字节时,可能会出现0的情况。

BSD 手册页指出:

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

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

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

我确实观察到AF_UNIX类型套接字上的send(2)返回零。

Yepp,这是由于零值的size字段。

所以,JFYI。