IOCompletionPortを使用してクライアントから読み取るサーバーを実装しようとしています。私はこの例に非常に似たものを持っています。
私が正しく理解していれば、これは私のデザインであるはずです:
- [メインスレッド]リッスンソケットを作成し、バインドしてリッスンします
- [メインスレッド]イベントを作成し、WSAEventSelectを使用してソケット受け入れ信号にアタッチします
- [スレッドを受け入れる]イベントを待ち、クライアントを受け入れる
- [スレッドを受け入れる]クライアントが接続するとき、CreateIOCompletionPortを使用してIOCompletionキューを使用します
- [Accept Thread] Acceptスレッドは、オーバーラップパラメータを使用して最初のWSARecvを呼び出します
- [ワーカースレッド]キューを使用して、WSARecvにリーダーフォロワーパターンを実装します
WSARecv(ここ)を読んだ後、データの準備ができていれば、WSARecvがデータとともにすぐに戻る可能性があることを発見しました。これは、クライアントが十分な速度で送信した場合、ワーカーがIOキューに戻らずにWSARecvでループする可能性があることを意味するため、ちょっと奇妙に思えます-そしてそれはクライアントの飢餓を引き起こす可能性があります...
ここに私の質問は次のとおりです。
- WSARecvをすぐに戻らないように「強制」する方法はありますか?つまり、100%の確率でIO_PENDINGを返すのですか?
- そうでない場合-スケーラビリティのために最適化された正しい設計は何でしょうか?
これが私がWSARecvを使用する方法です:
flags = 0;
receiveResult = WSARecv(clientSocket, &(olStruct->Buffer), 1, &bytesReceived, &flags, (OVERLAPPED*)olStruct, NULL);
olStructは、OVERLAPPED構造体の拡張機能です。
編集:PostQueuedCompletionStatusを使用してWSARecvから取得したものを再投稿することになりました。
回答を参照してくださいが、他の解決策を聞きたいです