天天看點

Linux下TCP keepalive屬性的表現

http://blog.chinaunix.net/uid-8489474-id-2031032.html

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 <sys/socket.h>   #include <netinet/in.h>   #include <arpa/inet.h>   #include <sys/types.h>   #include <netinet/tcp.h>   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, (void*)&keepIdle, sizeof(keepIdle));   setsockopt(rs, SOL_TCP, TCP_KEEPINTVL, (void *)&keepInterval, sizeof(keepInterval));   setsockopt(rs, SOL_TCP, TCP_KEEPCNT, (void *)&keepCount, sizeof(keepCount));   

在程式中表現為,當tcp檢測到對端socket不再可用時(不能發出探測包,或探測包沒有收到ACK的響應包),select會傳回socket可讀,并且在recv時傳回-1,同時置上errno為ETIMEDOUT.

繼續閱讀