2014-05-15 69 views
1

我正在嘗試設置TCP存活,但這樣做的,我看到的錯誤tcp keepalive - 協議不可用?

「協議不可用」

int rc = setsockopt(s, SOL_SOCKET, TCP_KEEPIDLE, &keepalive_idle, sizeof(keepalive_idle)); 
if (rc < 0) 
    printf("error setting keepalive_idle: %s\n", strerror(errno)); 

我能夠打開存活,設置存活時間間隔和次數但存活閒置是存活時間拋出的錯誤,我從來沒有看到正在發送/接收或者使用Wireshark和過濾器的任何保留數據包tcp.analysis.keep_alive或使用tcpdump

sudo tcpdump -vv "tcp[tcpflags] == tcp-ack and less 1" 

是否有一個內核模塊塔噸需要加載或什麼?或者你不再能夠覆蓋全球KEEPIDLE時間。

通過

[email protected]:~/ sysctl net.ipv4.tcp_keepalive_time net.ipv4.tcp_keepalive_probes net.ipv4.tcp_keepalive_intvl 
net.ipv4.tcp_keepalive_time = 7200 
net.ipv4.tcp_keepalive_probes = 9 
net.ipv4.tcp_keepalive_intvl = 75 
+0

tcp_keepalive_time以秒爲單位的時間被髮送的第一個活動包之前。根據你的例子,它被設置爲2小時。你真的等了那麼久嗎?減少它,然後再試一次。 – KBart

+0

@KBart - 確切地說。這是默認設置。我想從默認值改變它,但它給了我「協議不可用」。 – Matt

回答

2

在一個應用程序,我的代碼,以下工作:

setsockopt(*sfd, SOL_SOCKET, SO_KEEPALIVE,(char *)&enable_keepalive,sizeof(enable_keepalive)); 
    setsockopt(*sfd, IPPROTO_TCP, TCP_KEEPCNT, (char *)&num_keepalive_strobes,sizeof(num_keepalive_strobes)); 
    setsockopt(*sfd, IPPROTO_TCP, TCP_KEEPIDLE, (char *)&keepalive_idle_time_secs,sizeof(keepalive_idle_time_secs)); 
    setsockopt(*sfd, IPPROTO_TCP, TCP_KEEPINTVL, (char *)&keepalive_strobe_interval_secs,sizeof(keepalive_strobe_interval_secs)); 

嘗試改變SOL_SOCKETIPPROTO_TCPTCPKEEPIDLE

+0

Doh!感謝Prabhu。我將SOL_SOCKET作爲所有選項的第二個參數。它正在工作! – Matt

0

有一個非常方便的LIB的輸出,可以幫助你,這就是所謂的libkeepalive方式:http://libkeepalive.sourceforge.net/

它可以與LD_PRELOAD以啓用和控制使用備存─在所有TCP套接字上活着。您還可以使用環境變量覆蓋保持活動設置。

我試圖運行與它的TCP服務器:

KEEPIDLE=5 KEEPINTVL=5 KEEPCNT=100 LD_PRELOAD=/usr/lib/libkeepalive.so nc -l -p 4242 

然後我連接的客戶端:

nc 127.0.0.1 4242 

而且我想象使用Wireshark的交通:保活分組開始正好經過5秒鐘不活動(我的系統設置爲75)。因此這意味着可以覆蓋系統設置。

這裏是如何libkeepaliveTCP_KEEPIDLE

if((env = getenv("KEEPIDLE")) && ((optval = atoi(env)) >= 0)) { 
    setsockopt(s, SOL_TCP, TCP_KEEPIDLE, &optval, sizeof(optval)); 
    } 

看起來他們使用SOL_TCP代替SOL_SOCKET

+0

無法使用它。我不寫GPL代碼,所以也不能鏈接到它。我只想有什麼應該工作,工作。 – Matt

+0

好吧,但我告訴過你,你的代碼可能不起作用,因爲你使用SOL_SOCKET,libkeepalive使用SOL_TCP。 – Grapsus

+0

欣賞,但它只需要將SOL_SOCKET更改爲IPPROTO_TCP。固定。 – Matt