2017-04-16 34 views
0

我已經配置TCP保持連接的插座有以下功能:SO_KEEPALIVE:設置在服務器套接字上還是基於每個客戶端?

int configure_tcp_keepalive(int fd) 
{ 
    int opt_val = 1; 
    if (setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &opt_val, sizeof(opt_val)) == -1) 
     return -1; 

    int keepcnt = 9; //default value on Linux 
    if (setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &keepcnt, sizeof(keepcnt)) == -1) 
     return -1; 

    int keepidle = 30; 
    if (setsockopt(fd, SOL_TCP, TCP_KEEPIDLE, &keepidle, sizeof(keepidle)) == -1) 
     return -1; 

    int keepintvl = 30; 
    if (setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &keepintvl, sizeof(keepintvl)) == -1) 
     return -1; 
} 

如果我調用服務器FD這個功能,是否會影響每一個接受()處理客戶端(即接受()倒是客戶端繼承這些套接字選項,並因此配置爲TCP Keepalive)?我寧願不必爲每個客戶調用此函數,以儘量減少開銷。謝謝。

回答

0

它看起來像這應該工作。這本書的「Unix網絡編程」說:

enter image description here

+0

謝謝,我不知道這是否適用於其他SO_KEEPALIVE選項,以及。我想我必須檢查Wireshark。 – Hello

+0

也許吧。這本書很古老,當時可能不存在這些選項。試試看看。 – Barmar

+0

是的。它們也適用。 – Hello

相關問題