2017-04-16 3 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にこの関数を呼び出した場合、それはすべての受け入れ()に影響しますD「(DクライアントをIE)(受け入れます」クライアントはこれらのソケットオプションを継承し、TCPキープアライブ用に設定されます)。オーバーヘッドを最小限に抑えるために、すべてのクライアントに対してこの関数を呼び出す必要はありません。ありがとう。

答えて

0

これはうまくいくようです。書籍「UNIXネットワークプログラミングは、」言う:

enter image description here

+0

これは、他のSO_KEEPALIVEオプションに適用された場合のおかげで、私は疑問に思います。私はWiresharkにチェックしなければならないだろうと思う。おそらく、 – Hello

+0

。本はかなり古く、そのオプションはおそらく当時存在していませんでした。それを試してみてください。 – Barmar

+0

である。彼らも同様に適用されます。 – Hello

関連する問題