0

IOCompletionPortを使用してクライアントから読み取るサーバーを実装しようとしています。私はこの例に非常に似たものを持っています。

私が正しく理解していれば、これは私のデザインであるはずです:

  1. [メインスレッド]リッスンソケットを作成し、バインドしてリッスンします
  2. [メインスレッド]イベントを作成し、WSAEventSelectを使用してソケット受け入れ信号にアタッチします
  3. [スレッドを受け入れる]イベントを待ち、クライアントを受け入れる
  4. [スレッドを受け入れる]クライアントが接続するとき、CreateIOCompletionPortを使用してIOCompletionキューを使用します
  5. [Accept Thread] Acceptスレッドは、オーバーラップパラメータを使用して最初のWSARecvを呼び出します
  6. [ワーカースレッド]キューを使用して、WSARecvにリーダーフォロワーパターンを実装します

WSARecv(ここ)を読んだ後、データの準備ができていれば、WSARecvがデータ​​とともにすぐに戻る可能性があることを発見しました。これは、クライアントが十分な速度で送信した場合、ワーカーがIOキューに戻らずにWSARecvでループする可能性があることを意味するため、ちょっと奇妙に思えます-そしてそれはクライアントの飢餓を引き起こす可能性があります...

ここに私の質問は次のとおりです。

  1. WSARecvをすぐに戻らないように「強制」する方法はありますか?つまり、100%の確率でIO_PENDINGを返すのですか?
  2. そうでない場合-スケーラビリティのために最適化された正しい設​​計は何でしょうか?

これが私がWSARecvを使用する方法です:

flags = 0;
receiveResult = WSARecv(clientSocket, &(olStruct->Buffer), 1, &bytesReceived, &flags, (OVERLAPPED*)olStruct, NULL);

olStructは、OVERLAPPED構造体の拡張機能です。

編集:PostQueuedCompletionStatusを使用してWSARecvから取得したものを再投稿することになりました。 回答を参照してくださいが、他の解決策を聞きたいです

4

2 に答える 2

1

ハンドルを完了ポートに関連付けている場合、次の場合を除いて、成功してすぐに戻ることは、保留状態で戻るWSARecv()ことと意味的に同等です。WSARecv()

于 2015-03-15T04:14:15.567 に答える
0

WSARecvがすぐに完了すると、バッファを返し、IOCompletionPortキューにポストするようです。

したがって、現在の設計はまだ有効です。

于 2013-02-18T16:16:29.550 に答える