Windows IOCP APIを使用して、TCP接続がピアによって(RSTパケットなどを送信することによって)切断されたかどうかを確認するにはどうすればよいですか?具体的には、データを送受信できません。重複する操作は実行されていません。非同期通知を受け取りたいだけです。それを行う方法はありますか?
2 に答える
接続の閉鎖を検出するには、読み取りまたは書き込みを保留にする必要があります。RemyがRSTで提案するようにどちらかが返されますが、読み取りが保留されていると、リモート側が接続の送信側を閉じたときにも通知が届きます。
オーバーラップした読み取りを常に保留にしておくことをお勧めします。メモリを占有したくない場合は、これを常に0バイトの読み取りにすることができます。
IOCP完了ハンドラーは、ソケット操作が成功したか失敗したかを通知されます。パラメータは、どちらが当てはまるかを示します。
を使用している場合は、障害が発生した場合GetQueuedCompletionStatus()
に戻ります。FALSE
ソケット障害の場合は、失敗した操作*lpOverlapped
のNULL以外のポインタ値に設定されます。それ自体が失敗したOVERLAPPED
場合、 NULLに設定されます。ピアが正常に切断すると、TRUEが返され、代わりに0に設定されます。GetQueuedCompletionStatus()
*lpOverlapped
*lpNumberOfBytes
を使用してWSAgetOverlappedResult()
いる場合、障害が発生するとFALSEが返されます。WSAGetLastError()
ソケット障害かどうかを判断するために使用します。ピアが正常に切断すると、TRUEが返され*lpcbTrasfer
、代わりに0に設定されます。