4

1 つのソケットを管理するクライアント アプリケーションを開発しています。IOCP を使用して非同期 I/O を管理しています。

これは、ネットワーキング プログラミングの本からの引用です。

重複するすべての操作は、アプリケーションが発行した順序で実行されることが保証されます。ただし、完了ポートから返される完了通知が同じ順序であるとは限りません。つまり、アプリケーションが 2 つのオーバーラップした WSARecv 操作 (1 つは 10 KB バッファー、次は 12 KB バッファー) を送信した場合、10 KB バッファーが最初にいっぱいになり、次に 12 KB バッファーが続きます。アプリケーションのワーカー スレッドは、10 KB 操作の完了イベントの前に、12 KB WSARecv の GetQueuedCompletionStatus から通知を受け取る場合があります。もちろん、これはソケットに複数の操作がポストされた場合にのみ問題になります。

では、この場合の対応はどうすればよいのでしょうか。

4

1 に答える 1

3

最も簡単な解決策は、未処理の読み取りまたは書き込みを 1 つだけにすることです。したがって、完了が通知された場合、すべてのデータがソケットに書き込まれたことは明らかです。IO が完了するのを待っている間にソケットにさらにデータを書き込む必要がある場合は、IO が完了したときにそのデータをバッファリングして書き込むだけです。

ソケットへの未処理の IO が複数ある場合は、それらを読み取り側で注文する必要があります。書き込み側では、どの書き込みが最後で、いつデータが完全に書き込まれたかを把握するために、帳簿を付ける必要があります。

一方、ソケットにデータを正常に書き込んだからといって、データが正しく受信され、相手側で処理されたということにはならないため、何らかのプロトコルが必要です。その場合は、そのプロトコルに頼ってエラー通知を探すだけです。

于 2012-07-26T13:47:20.723 に答える