我在某处读到每个 TCP 连接都有自己的 125kB 输出和输入缓冲区。如果这个缓冲区已满,而我仍然继续在 Linux 上发送数据,会发生什么?
根据http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.html http://www.kernel.org/doc/man-pages/online/pages/man2/send.2.html这些数据包只是默默地丢弃,没有通知我。我可以做什么来阻止这种情况发生?有什么方法可以查明我的至少部分数据是否已正确发送,以便我可以稍后继续?
简短的回答是这样的。 TCP 套接字上的“发送”调用将一直阻塞,直到由于远程端点接收和使用数据而打开 TCP 滑动窗口(或内部队列缓冲区)。这与尝试以快于磁盘保存速度的速度向文件写入字节没有太大区别。
如果您的套接字配置为非阻塞模式,则 send 将返回 EWOULDBLOCK 或 EAGAIN,直到可以发送数据为止。标准poll http://www.kernel.org/doc/man-pages/online/pages/man2/poll.2.html, select http://www.kernel.org/doc/man-pages/online/pages/man2/select.2.html, and epoll http://www.kernel.org/doc/man-pages/online/pages/man4/epoll.4.html呼叫将按预期工作,因此您知道何时再次“发送”。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)