1

有没有办法检查 TCP 连接的发送缓冲区是否完全为空?直到现在我还没有找到任何东西,只是想确保我的服务器没有关闭连接,同时仍有数据正在传输到某个客户端。

我正在使用 poll 来检查我是否能够在非阻塞套接字上发送数据。但是,我无法确定是否所有内容都已发送到缓冲区,是吗?

4

1 回答 1

5

在 Linux 中,您可以使用ioctl(sd, SIOCOUTQ, &bytes). 详情请参阅man ioctl

从远程主机可能接收到数据的意义上说,该信息并不完全可靠,因为在接收到 ACK 之前无法清空缓冲区。您可能不应该使用它在 TCP 之上添加另一个级别的流量控制。

如果远程主机实际上关闭了连接(或半关闭),那么无论缓冲区中可能有多少数据,套接字都会变得不可写。您可以通过向套接字写入 0 个字节来检测这种情况。

更困难(并且通常更有可能)的情况是远程主机变得无法访问,因为网络问题或因为它崩溃。在这种情况下,数据会堆积在发送缓冲区中,但这也可能是因为远程主机的接收缓冲区已满(可能是因为读取缓冲区的进程没有足够的资源来处理其输入)。在网络路由问题的情况下,您可能会收到路由器通知(ICMP 错误),这会使套接字不可写;不幸的是,有许多网络错误只会导致黑洞。

于 2012-09-18T14:30:40.483 回答