以下のコードを使用して、TCP ポートに書き込みを行う 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 ポートに書き込みを行っており、1 秒間に数回書き込みを試みています。
// write null packet to determine if connection is still good
return ( send( GetDescriptor(),(char*)NULL, 0, 0 ) != -1 );
他の入力接続を閉じるたびに、上記のテストに基づいて、アプリケーションが接続がダウンしていることを報告するのに 1 分かかります。ハンドラー関数がある場合SIGPIPE
、それも呼び出されるまでに 1 分かかります。
私が見たすべてのドキュメントは、キープアライブ パラメーターが分単位ではなく秒単位であることを示しています。しかし、切断された接続を 1 分未満で検出することはできません。
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
この動作は別のシステム パラメータによって制御されますか? 一部のドキュメントとは対照的に、キープアライブパラメーターは実際には分単位ですか? このタイムアウト パラメータに影響を与える可能性のあるコードで、特定の関数を探す必要がありますか?