[英]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的一個好點是我的問題可能毫無意義,因為在大多數情況下, errno
在send
期間具有值EAGAIN
的原因是客戶端無法跟上傳輸。 在這種情況下,您只需close(client_socket);
並與該特定客戶一起完成。 如果您需要更高級的功能,則應創建某種算法,該算法將使用一組試探法來確定此類客戶端的狀態,並相應地進行處理,而不是簡單地刪除連接,除非您真正想要的是。
您可以使用的一個非常基本的啟發式示例是給每個客戶分配時間,直到他們被認為沒有反應為止。 例如,如果在接下來的5-10秒鍾內您在同一客戶端上繼續獲得EAGAIN
,則該客戶端將被視為無響應,您可以關閉連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.