3

基本的なマッチメイキング サーバーを開発しています。基本的なプロセスは次のようになります。

  1. クライアントはサーバーに接続し、クライアントの名前と探している一致の種類を報告します
  2. サーバーは可能なすべての一致を報告します
  3. クライアントは、ペアにしたい試合を選択します
  4. サーバーは 2 つのクライアントに一致します

問題は、クライアントが接続するたびに、この新しいクライアントと一致する可能性のあるすべてのクライアントに報告し、その新しい接続クライアントに可能なすべての一致を報告する必要があることです (したがって、一致しないクライアントは常にrecvサーバーからの準備ができている必要があります)。同時に、クライアントはいつでも一致を選択するか、切断することができます (したがって、クライアントは常に準備ができてsendおり、サーバーは準備ができている必要がありますrecv) 。

この問題の本当の解決策は、recvスレッド、クライアントとサーバーのバックグラウンド スレッド、およびメインのユーザー対話sendスレッドを使用することだと思います。

したがって、これに関連して2つの質問があります。

  1. 異なるスレッドで同時に同じソケット接続に保存さsendれますか?recv
  2. これはこれを処理する正しい方法ですか?

(サーバーは C++ で構築され、クライアントは obj-c であるため、C++ および obj-c としてタグ付けされています)

4

2 に答える 2

2

はい、同じソケットを使用して、recv()あるスレッドと別のスレッドで安全です。send()

サーバー側で専用スレッドを使用すると、同時にサーバーに同時に接続するクライアントが比較的少ない場合にのみ効果的に機能します。スケーラビリティが問題になる場合は、必要なスレッドの数を最小限に抑えながら、単一のスレッドで複数のクライアントを管理するために、非同期 I/O または可能であれば I/O 完了ポートを使用する必要があります。

于 2013-04-10T15:51:03.817 に答える
1

妥当なソケット ライブラリの実装では安全です。それは正しい方法でもあります。

于 2013-04-10T15:47:21.463 に答える