2

オーバーラップ操作でソケットを使用して、イベントベースの完了通知を選択しました。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でのみ機能しますか?

4

1 に答える 1

1

一度送信したものをキャンセルしようとしても意味がありません。成功したとしても、受信アプリケーションは送信が中断されたことを認識できないため、問題が発生します。あなたの新しいメッセージは、古いメッセージの終わりと間違えられます。

長い送信をキャンセルする必要がある場合は、おそらくアプリケーションの設計を検討する必要があります。

  • チャンクで送信し、チャンク間のキャンセルをチェックします。送信がキャンセルされたことを受信者に伝える方法があることを確認してください。
  • ソケットを閉じてキャンセルします。繰り返しになりますが、これが中断された送信であることをクライアントが知る方法があることを確認してください (たとえば、クライアントが事前に合計の長さを知っている場合、クライアントは中断された送信を認識します)。
  • バックグラウンドで成功するのを待つだけで、心配する必要はありません。緊急のメッセージがある場合は、別の接続を使用してください。

あなたの特定の質問「ソケットをすぐに別の目的で使用する必要がある場合、バックグラウンドの送受信を停止する適切な方法は何ですか」に対する答えは次のとおりです。緊急メッセージの場合はその他。

于 2012-05-24T21:59:40.953 に答える