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