java socket 判断是否断开_Linux Socket:如何在客户端程序中检测断开的网络?
僅在調用write()函數時才能檢測到未插入的以太網電纜 . 這是因為tcp堆棧的tcp重傳沒有你的意識 . 這是解決方案 .
即使您已經為應用程序套接字設置了keepalive選項,但是如果您的應用程序一直在套接字上寫入,您無法及時檢測到套接字的死連接狀態 . 那是因為內核tcp堆棧的tcp重傳 . tcp_retries1和tcp_retries2是用于配置tcp重傳超時的內核參數 . 很難預測重傳超時的精確時間,因為它是由RTT機制計算的 . 你可以在rfc793中看到這個計算 . (3.7 . 數據通信)
每個平臺都具有用于tcp重傳的內核配置 .
Linux : tcp_retries1, tcp_retries2 : (exist in /proc/sys/net/ipv4)
HPUX : tcp_ip_notify_interval, tcp_ip_abort_interval
AIX : rto_low, rto_high, rto_length, rto_limit
如果要提前檢測死連接,則應為tcp_retries2(默認值為15)設置較低的值,但它僅為單個套接字設置這些值 . 那些是全局內核參數 . 有一些嘗試為單個套接字應用tcp重新傳輸套接字選項(http://patchwork.ozlabs.org/patch/55236/),但我沒有在系統頭文件中找到這些選項定義 .
作為參考,您可以通過'netstat --timers'監控您的keepalive套接字選項,如下所示 . https://stackoverflow.com/questions/34914278
netstat -c --timer | grep "192.0.0.1:43245 192.0.68.1:49742"
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (1.92/0/0)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (0.71/0/0)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (9.46/0/1)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (8.30/0/1)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (7.14/0/1)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (5.98/0/1)
tcp 0 0 192.0.0.1:43245 192.0.68.1:49742 ESTABLISHED keepalive (4.82/0/1)
此外,當keepalive超時時,您可以根據您使用的平臺遇到不同的返回事件,因此您不能僅通過返回事件來確定死連接狀態 . 例如,當發生keepalive超時時,HP返回POLLERR事件,AIX僅返回POLLIN事件 . 那時您將在recv()調用中遇到ETIMEDOUT錯誤 .
在最近的內核版本(自2.6.37)中,您可以使用TCP_USER_TIMEOUT選項將運行良好 . 此選項可用于單個插槽 .
最后,您可以使用帶有MSG_PEEK標志的read函數,它可以讓您檢查套接字是否正常 . (MSG_PEEK只是看看數據是否到達內核堆棧緩沖區并且從不將數據復制到用戶緩沖區 . )因此,您可以使用此標志僅用于檢查套接字是否正常,沒有任何副作用 .
總結
以上是生活随笔為你收集整理的java socket 判断是否断开_Linux Socket:如何在客户端程序中检测断开的网络?的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 微软情何以堪!用户对升级Win11不感冒
- 下一篇: 日元贬值后遭疯抢:苹果上调日本iPhon