簡體   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