Linux作業系統下TCP keepalive屬性檢視
阿新 • • 發佈:2019-02-04
Tcp是面向連線的,在實際應用中通常都需要檢測連線是否還可用.如果不可用,可分為:
a. 連線的對端正常關閉.
b. 連線的對端非正常關閉,這包括對端裝置掉電,程式崩潰,網路被中斷等.這種情況是不能也無法通知對端的,所以連線會一直存在,浪費資源.
tcp協議棧有個keepalive的屬性,可以主動探測socket是否可用,不過這個屬性的預設值很大.
全域性設定可更改/etc/sysctl.conf,加上:
net.ipv4.tcp_keepalive_intvl = 20 net.ipv4.tcp_keepalive_probes = 3 net.ipv4.tcp_keepalive_time = 60 |
在程式中設定如下:
#include #include #include #include #include int keepAlive = 1; // 開啟keepalive屬性 int keepIdle = 60; // 如該連線在60秒內沒有任何資料往來,則進行探測 int keepInterval = 5; // 探測時發包的時間間隔為5 秒 int keepCount = 3; // 探測嘗試的次數.如果第1次探測包就收到響應了,則後2次的不再發. setsockopt(rs, SOL_SOCKET, SO_KEEPALIVE, (void *)&keepAlive, sizeof(keepAlive)); setsockopt(rs, SOL_TCP, TCP_KEEPIDLE |
在程式中表現為,當tcp檢測到對端socket不再可用時(不能發出探測包,或探測包沒有收到ACK的響應包),select會返回socket可讀,並且在recv時返回-1,同時置上errno為ETIMEDOUT。
版權申明:本站文章均來自網路,如有侵權,請聯絡我 ,我們收到後立即刪除,謝謝!
幫我理解了uhttpd中的一段程式碼。