2

Windows IOCP APIを使用して、TCP接続がピアによって(RSTパケットなどを送信することによって)切断されたかどうかを確認するにはどうすればよいですか?具体的には、データを送受信できません。重複する操作は実行されていません。非同期通知を受け取りたいだけです。それを行う方法はありますか?

4

2 に答える 2

4

接続の閉鎖を検出するには、読み取りまたは書き込みを保留にする必要があります。RemyがRSTで提案するようにどちらかが返されますが、読み取りが保留されていると、リモート側が接続の送信側を閉じたときにも通知が届きます。

オーバーラップした読み取りを常に保留にしておくことをお勧めします。メモリを占有したくない場合は、これを常に0バイトの読み取りにすることができます。

于 2012-06-26T21:01:53.847 に答える
1

IOCP完了ハンドラーは、ソケット操作が成功したか失敗したかを通知されます。パラメータは、どちらが当てはまるかを示します。

を使用している場合は、障害が発生した場合GetQueuedCompletionStatus()に戻ります。FALSEソケット障害の場合は、失敗した操作*lpOverlappedのNULL以外のポインタ値に設定されます。それ自体が失敗したOVERLAPPED場合、 NULLに設定されます。ピアが正常に切断すると、TRUEが返され、代わりに0に設定されます。GetQueuedCompletionStatus()*lpOverlapped*lpNumberOfBytes

を使用してWSAgetOverlappedResult()いる場合、障害が発生するとFALSEが返されます。WSAGetLastError()ソケット障害かどうかを判断するために使用します。ピアが正常に切断すると、TRUEが返され*lpcbTrasfer、代わりに0に設定されます。

于 2012-06-26T18:51:35.633 に答える