オーバーラップ操作でソケットを使用して、イベントベースの完了通知を選択しました。2つのイベントがあります。1つはデータ用で、もう1つは長い送信/受信をキャンセルするためのものです。
HANDLE events[] = { m_hDataEvent, m_hInterruptEvent };
次に、WSASendを呼び出します。
WSASend(m_Socket, &DataBuf, 1, NULL, 0, &SendOverlapped, NULL);
に続く
WSAWaitForMultipleEvents(2, events, FALSE, INFINITE, FALSE);
これは、通知された任意の1つのイベントに戻るように設定されています。ここで、送信が進行中であり、m_hInterruptEventが通知されたと仮定します。WSAWaitForMultipleEventsが戻ります。技術的には、sendを呼び出す関数も戻り、内部で割り当てられたバッファーを削除できます。
私にはわかりませんが、WSASendはまだバックグラウンドで動作している可能性があり、バッファを削除すると、最良の場合、データが破損します。
ソケットを他の何かにすぐに使用する必要がある場合、バックグラウンドの送信/受信を停止する適切な方法は何でしょうか?
CancelIO()を見ましたが、MSDNはSocketsに関連して言及していません。ファイルベースのIOでのみ機能しますか?