繁体   English   中英

在Linux中发送缓冲区空Socket?

[英]Send buffer empty of Socket in Linux?

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM