1

リモート ホスト (Windows または Linux) との TCP ネットワーク接続があります。リモート ホスト プロセスが終了すると、recv() が失敗し、接続が閉じていることがわかります。

しかし、リモートホストが実際にデータを受信せずに接続を閉じたかどうかを確認する方法はありますか?

ポイントは、リモートホストがまだ生きているかどうかを定期的に確認したいが、データを送受信したくないということです。

前もって感謝します

4

2 に答える 2

4

明確にするためにrecv()、接続が適切に閉じられていれば失敗するべきではありません。EOF (0 バイト) を返す必要があります。recv()接続が異常終了した場合は失敗します。

接続が閉じられていない場合に実際にデータを受信せずに接続が閉じられたかどうかを確認するには、おそらくフラグを指定recvmsg()して呼び出すことをお勧めします。MSG_PEEK1 バイトだけ要求します。接続が閉じられている場合は、EOF (正常終了) またはエラー (異常終了) が発生します。閉じられていない場合は、EAGAIN(ソケットを非ブロック モードにすると仮定して) または 1 バイトのデータを取得します。つまり、技術的には 1 バイトのデータを受信しましたがMSG_PEEK、カーネルは受信したという事実を記録しないため、受信しなかったかのようになります。これはすべて、潜在的なエラーが発生する前に到着したストリームからのすべてのデータをカーネルのバッファーから既に読み込んでいると想定しています。

もちろん、 rakibのコメントが当てはまります:「データを与えたり受け取ったりしたくないのであれば、リモートホストが生きているかどうかを確認する方法はありません。」. つまり、このメソッドは、接続を閉じずにリモート ホストがネットワークから消えるなどのシナリオを検出しません。

于 2013-05-16T16:31:03.007 に答える