有没有办法检查 TCP 连接的发送缓冲区是否完全为空?到目前为止我还没有找到任何东西,只是想确保在仍有数据传输到某个客户端时我的服务器没有关闭连接。
我正在使用轮询来检查是否能够在非阻塞套接字上发送数据。但这样我就无法知道是否所有内容都已发送到缓冲区中,不是吗?
在 Linux 中,您可以使用 查询套接字的发送队列ioctl(sd, SIOCOUTQ, &bytes)。man ioctl详情请参阅。
该信息并不完全可靠,因为远程主机可能已接收到数据,因为在接收到 ACK 之前缓冲区无法清空。您可能不应该使用它在 TCP 之上添加另一个级别的流量控制。
如果远程主机实际上关闭了连接(或半关闭它),则无论缓冲区中有多少数据,套接字都将变得不可写。您可以通过向套接字写入 0 字节来检测这种情况。
更困难(通常更可能)的情况是远程主机由于网络问题或崩溃而变得无法访问。在这种情况下,数据将堆积在发送缓冲区中,但也可能发生这种情况,因为远程主机的接收缓冲区已满(可能是因为读取缓冲区的进程没有足够的资源来处理其输入)。在网络路由问题的情况下,您可能会收到路由器通知(ICMP 错误),这将使套接字不可写;不幸的是,有许多网络错误只会导致黑洞。
| 归档时间: |
|
| 查看次数: |
3340 次 |
| 最近记录: |