簡體   English   中英

TCP緩沖死鎖,如何斷開未接收數據的用戶?

[英]TCP buffering deadlock, how can i disconnect a user who isn't receiving data?

我有一台運行良好的服務器,除非我通過對其發送垃圾郵件來進行性能測試。 客戶端不只接收發送的數據,然后服務器陷入死鎖。

如何檢查最終用戶是否未接收到數據並相應地斷開數據連接,是否會觸發我可以解決的某種類型的錯誤?

干杯

Beej的指南對套接字有很好的參考。 如果您喜歡send(socket, buffer, buffer_length, MSG_DONTWAIT);類的調用,則可以根據需要使用errno的值send(socket, buffer, buffer_length, MSG_DONTWAIT); 進行並返回-1 具有EAGAIN值的errno表示處理出站流量的緩沖區當前已滿。

要問的一個問題是,您的客戶是否實際上就是那些已經滿員的客戶。 服務器緩沖區的清空速度是否比您要寫入的緩沖區快?

@EJB的一個好點是我的問題可能毫無意義,因為在大多數情況下, errnosend期間具有值EAGAIN的原因是客戶端無法跟上傳輸。 在這種情況下,您只需close(client_socket); 並與該特定客戶一起完成。 如果您需要更高級的功能,則應創建某種算法,該算法將使用一組試探法來確定此類客戶端的狀態,並相應地進行處理,而不是簡單地刪除連接,除非您真正想要的是。

您可以使用的一個非常基本的啟發式示例是給每個客戶分配時間,直到他們被認為沒有反應為止。 例如,如果在接下來的5-10秒鍾內您在同一客戶端上繼續獲得EAGAIN ,則該客戶端將被視為無響應,您可以關閉連接。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM