在Linux中发送缓冲区为空的Socket?

有没有办法来检查一个TCP连接的发送缓冲区是否完全是空的? 到目前为止我还没有find任何东西,只是想确保一个连接没有被我的服务器closures,而仍然有数据被传输到某个客户端。

我使用轮询来检查我是否能够在非阻塞套接字上发送数据。 但是,由于我不能够确定是否所有的东西都被送到了缓冲区,是吗?

在Linux中,您可以使用ioctl(sd, SIOCOUTQ, &bytes)查询套接字的发送队列。 有关详细信息,请参阅man ioctl

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

如果远程主机实际上关闭连接(或半关闭连接),则不管缓冲区中有多少数据,该套接字都不可写。 您可以通过向套接字写入0个字节来检测到这种情况。

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