2

キープアライブ メッセージが応答を受信しない場合に接続を閉じて再接続するために、TCP SO_KEEPALIVE を実装しようとしています。私の問題は、これで運がなかったということです。それは、正しく実装していないためだと思います(希望)。以下は、私がこれをどのように実装しているかの例です。

//var to re-set socket's timeout value
struct timeval timeout; 

//creates a variable for KEEPALIVE's optval parm
 int optval; 

//creates a variable for KEEPALIVE's optlen parm
   socklen_t optlen = sizeof(optval); 

// sets KEEPALIVE parms
optval = 1;
optlen = sizeof(optval);

// turns on KEEPALIVE property on socket
if (setsockopt (Socket, SOL_SOCKET, SO_KEEPALIVE, &optval, optlen) < 0)
    {
        CloseSocket(Socket, 0);
        connect(Socket);

    }
4

2 に答える 2

3

あなたのコードは、ソケットオプションを設定してからすぐに閉じて再度開いていることを示しているだけです。ソケット オプションを設定しても、キープアライブが失敗したことは通知されません。ソケットをチェックした結果としてそれが得られます(読み取り、書き込み、ポーリング/選択など)。オプションを設定すると、キープアライブの送信とチェックがオンになります。errno として ETIMEDOUT を探します。

于 2013-01-29T15:10:37.053 に答える
1

TCP KEEPALIVE が失敗すると、検出後のソケットへの次の読み取りまたは書き込みでエラーが発生します (通常は ECONNRESET)。具体的には KEEPALIVE の障害として区別することはできません。実際には一般的な I/O エラーです。

于 2013-01-29T15:45:34.840 に答える