このCreateIoCompletionPort
関数を使用すると、新しい I/O 完了ポートを作成し、既存の I/O 完了ポートにファイル ハンドルを登録できます。
recv
次に、ソケットに対する や構造をReadFile
持つファイルに対するなど、任意の関数を使用OVERLAPPED
して非同期操作を開始できます。
関数呼び出しがOVERLAPPED
構造体で呼び出されたにもかかわらず同期的に返されたかどうかを確認する必要があり、この場合は直接処理します。それ以外の場合は、ERROR_IO_PENDING
が返さGetQueuedCompletionStatus
れたときに、操作が完了したときに通知される機能を使用できます。
発生する質問は次のとおりです。
I/O 完了ポートからハンドルを削除するにはどうすればよいですか? たとえば、ソケットを IOCP に追加する場合、閉じているソケットを削除するにはどうすればよいですか? 同じ完了キーで別のソケットを再登録する必要がありますか?
また、呼び出しが常に I/O 完了ポートを通過し、同期的に返されないようにする方法はありますか?
そして最後に、たとえば
recv
非同期ではなくsend
同期にすることは可能ですか? たとえば、単純なエコー サービスが実装されている場合:コードの複雑さを軽減するために、recv
新しいデータを非同期で待機し、応答を同期的に待機することはできますか?send
私の場合、recv
最初のリクエストが処理される前に、とにかく二度目はしません。非同期
ReadFile
が要求されたが、それが完了する前にWriteFile
、同じファイルへの を処理する必要がある場合はどうなりますか。ReadFile
エラーメッセージが表示されてキャンセルされ、書き込みが完了したらすぐに読み取りプロセスを再開する必要がありますか?ReadFile
または、書き込む前に手動でキャンセルする必要がありますか? この問題は、通信デバイスと組み合わせて発生します。そのため、書き込みと読み取りが同時に発生しても問題は発生しません。