注意: OP はコメント スレッドで、投稿されたコードには表示されていないタイプミスによる問題であることを確認しています。
DisconnectEx で重複した切断をスケジュールした後、GetQueuedCompletionStatus を使用して通知を受け取ることを期待していました。1 つも取得できません。これは設計によるものですか? OVERLAPPED 構造体で手動リセット イベントを指定すると、これは切断が完了したことを示すために通知されますが、GetQueuedCompletionStatus は返されません。
私の DisconnectEx への呼び出しは、次のようになります (context には演算子 LPOVERLAPPED があり、ol は構造体の最初の要素であることに注意してください)。
context.ol.hEvent = hEvent;
BOOL result = DisconnectEx(context.socket, context, TF_REUSE_SOCKET, 0);
if (result)
{
// we completed synchronously:
ProcessCompletion(0, context, 0);
}
else
{
int error = WSAGetLastError();
if (error != ERROR_IO_PENDING)
{
throw ServerSocketException("DisconnectEx failed");
}
WaitForSingleObject(hEvent, INFINITE);
std::cout << "disconnected - event signalled\n";
}
GetQueuedCompletionStatus が返されないことがわかったときに、WaitForSingleObject を追加しました。DisconnectEx の完了を検出する正しい方法は何ですか? AcceptEx の呼び出しでソケットを再度使用したい。