我在通過下面的代碼寫入TCP端口的C++應用程序中實現Keepalive時間。沒有顯示,但我確實檢查了有效的退貨狀態,以驗證設置選項是否有效。Keepalive時間 - 在C++中不能減少到一分鐘以下
int option = 1;
int keepalive_intvl = 1;
int keepalive_count = 1;
int keepalive_idle = 1;
setsockopt(the_socket, SOL_SOCKET, SO_KEEPALIVE, &option, sizeof (int));
setsockopt(the_socket, SOL_TCP, TCP_KEEPINTVL, &keepalive_intvl, sizeof(int));
setsockopt(the_socket, SOL_TCP, TCP_KEEPCNT, &keepalive_count, sizeof(int));
setsockopt(the_socket, SOL_TCP, TCP_KEEPIDLE, &keepalive_idle, sizeof(int));
我的應用程序正在寫入TCP端口,並嘗試每秒寫入數次。
// write null packet to determine if connection is still good
return (send(GetDescriptor(),(char*)NULL, 0, 0) != -1);
每當我關閉其他,輸入連接,它需要一分鐘,我的申請報告,連接中斷,基於上面的測試。如果我有一個SIGPIPE
處理程序函數,它也需要一分鐘時間才能被調用。
我看到的每個文檔都表明keepalive參數是以秒爲單位的,而不是分鐘。但是我無法在1分鐘之內檢測到丟失的連接。
我也試過改變系統變量keepalive討論在tldp.org討論,但無濟於事。
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_time
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_intvl
echo 1 > /proc/sys/net/ipv4/tcp_keepalive_probes
此行爲是否受另一個系統參數控制?與一些文檔相反,Keepalive參數實際上是在幾分鐘內?有什麼函數可以影響這個超時參數嗎?
選項是一個int不INT32 – QuentinUK 2013-03-05 18:13:52
@QuentinUK,他們在我的代碼相同。儘管如此,編輯清晰。 – Chance 2013-03-05 18:22:01
您是否嘗試過實際檢查'setsockopt()'的返回碼? – 2013-03-05 18:32:26