0

クライアントがサーバーにメッセージを送信し、サーバーが recv() メソッドを介してメッセージを読み取る複数のクライアントと対話するサーバーがあります。私が得る問題は、サーバーが1つのクライアントと対話するのを数秒間待機させてから、他のユーザーがそれにアクセスできるようにするために、waitforsingleobject(handler、10000ミリ秒)を使用していることですが、その後、サーバーから間違った回答が表示され始めますクライアントへのメッセージとブロックされます。同期の問題のように見えます。

したがって、私の質問は (私は C++ の初心者なので)、すべての受信メッセージを確実に受信して適切なクライアントに返信し、すべてのクライアントがサーバーと対話できるようにするにはどうすればよいかということです。

4

1 に答える 1

0

2 つの選択肢があります。

1 つ目はかなり標準的なモデルで、クライアントごとに 1 つのスレッドです。クライアントが接続すると、スレッドを開始してそれを処理します。

2 番目のアプローチでは、多くのスレッドは必要ありません。オーバーラップしたソケットでは、recv() の代わりに WSARecv() を使用する必要があります。このように、クライアントごとに 1 つずつ、複数の受信操作を同時に開き、それらすべてを WaitForMultipleObjects() で待機できます。具体的には、WSAOVERLAPPED 内でイベントを待機します。WaitForMultipleObjects() には、待機オブジェクトの数に制限があることに注意してください。超過すると、別のスレッドを実行する必要があります。WaitForMultipleObjects() からの戻りコードは、どのクライアントがデータを送信したかを示しているので、それに返信することができます。

または、上記で提案したように、おそらく select() を使用して、どのソケットにデータがあるかを把握できます。

于 2013-02-19T08:22:41.817 に答える