ソケットハンドルを直接待つことはできません。
WSAAccept()
は同期ですが、中止する唯一の方法はリスニングソケットを閉じることです。
代わりに、AcceptEx()
を使用してください。これは非同期で、オーバーラップI/OとI/O完了ポートをサポートしています。
あなたが重複したI/Oを使用する場合は、それぞれ重複したI/Oが可能なソケット操作(AcceptEx()
、WSARecv()
、WSASend()
、など)に標準のWin32イベントオブジェクトを関連付け、そしてあなたの停止イベントのための標準のWin32イベントオブジェクトを使用することができます。次に、WaitForMultipleObjects()
ループを使用して、どのイベントが通知され、それに応じて動作するかを知ることができます。
I/O完了ポートを使用する場合、イベントオブジェクトはまったく必要ありません。各ソケットを単一のIOCPキューに関連付けることができ、各IOCP対応ソケット操作が完了するたびにIOCPハンドラ(GetQueuedCompletionStatus()
またはコールバック関数の呼び出し)が通知されます。 PostQueuedCompletionStatus()
を使用して、カスタム停止メッセージをIOCPキューに送信できます。 IOCPハンドラは、受信するイベントの種類に応じて動作することができます。
代わりに[AcceptEx](https://msdn.microsoft.com/en-us/library/windows/desktop/ms737524(v = vs.85).aspx)を使用する必要があります。「WSAAccept」 - このAPIは非同期です。あなたはそれをまったく待つ必要はありません。ソケット(2番目のパラメータ)をIOCPにバインドすると、接続が完了したときにコールバックを受け取る – RbMm