This question already has an answer here:
Why is it assumed that send may return with less than requested data transmitted on a blocking socket?

(1个答案)


7年前关闭。




select返回后,为tcp套接字设置了写fd。如果尝试在该套接字上发送数据,使用send API一次发送的数据的最小保证大小是多少?我知道我必须运行一个循环以确保所有数据都已发送。我还是想了解发送的最低保证数据是什么,为什么?

最佳答案

这已经出现过了。我仍在寻找引用答案。

让我们从send()的函数原型(prototype)开始
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
对于阻止TCP套接字-所有文档将建议send()和write()将返回[1..len]之间的值,除非出现错误。但是,现实情况是,据我所知,没有人看到send()在成功案例中返回-1(错误)或“len”以外的值,以表明所有“buf”都在一次调用中发送。我从未对此感到满意,因此我进行了防御性编码,只是将阻塞的send调用放入循环中,直到发送了整个缓冲区为止。

对于非阻塞TCP套接字-您应该只将其编码为最小值为“1”(错误时为-1)。不要对最小数据大小做任何假设。

对于recv(),您应该始终假定recv()在成功情况下将返回介于1..len或0(关闭)或-1(错误)之间的随机值。永远不要以为recv将返回完整的缓冲区。

09-26 23:02
查看更多