2

我在某处读到每个 TCP 连接都有自己的 125kB 输出和输入缓冲区。如果这个缓冲区已满,我仍然继续在 linux 上发送数据会怎样?

根据http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.html数据包只是默默地丢弃,没有通知我。我能做些什么来阻止这种情况发生?有什么方法可以查明我的至少一些数据是否已正确发送,以便我可以在稍后的时间点继续?

4

2 回答 2

7

简短的回答是这样的。TCP 套接字上的“发送”调用只会阻塞,直到 TCP 滑动窗口(或内部队列缓冲区)由于远程端点接收和使用数据而打开。这与尝试将字节写入文件的速度快于磁盘可以保存它的速度没有太大区别。

如果您的套接字配置为非阻塞模式,则 send 将返回 EWOULDBLOCK 或 EAGAIN,直到可以发送数据。标准pollselectepoll调用将按预期工作,因此您知道何时再次“发送”。

于 2012-09-04T18:53:52.933 回答
0

我不知道“数据包被丢弃”。我认为更有可能的是程序对 write() 的调用将阻塞或返回失败。

于 2012-09-04T18:38:37.760 回答