3

マルチプレイヤーネットワークゲームを作っています。サーバーに接続するには、クライアントはサーバーのIPアドレスを必要とします。

したがって、これを実装する方法は次のとおりです。

クライアントはブロードキャストIPでIPアドレスをブロードキャストし、ポートはAと言います。サーバーはAを介してIPアドレスをリッスンします。

サーバーは、クライアントがポートBを介して言うように動作するクライアントとの新しいUDP接続を作成します。サーバーは、IPを含むゲームに必要なすべての重要な情報を送信します。

クライアントはこの接続のサーバーであり、ポートBを介してサーバーからデータを受信します。

ここで、AとBは定数です。したがって、サーバーが異なるスレッドで複数のクライアントをリッスンする必要がある場合、スレッドのAとBに差分値を設定できますが、クライアントファイルではAとBはこれらのスレッドから独立しています。だからそれは私にエラーを与えます

bind: Address already in use

これに対するもっともらしい解決策は何ですか?

4

1 に答える 1

5

まず第一に、クライアントにそのアドレスをブロードキャストさせることは、少なくとも私にはかなり恐ろしいことのように聞こえます。ブロードキャストとは、サーバーがローカルサブネット上にある場合にのみ機能し、不要なトラフィックでネットワークを汚染することを意味します。

クライアントにDNSサービスディスカバリ(DNS-SD)を介してサーバーを見つけてもらいます。これには、サーバーがローカルサブネット上にある限りマルチキャストDNSを使用でき、クライアントにまったく変更を加えることなく、通常の管理対象DNSを使用して広域サーバーに移行できるという利点があります。

次に、サーバーは各クライアントにスレッドを割り当てるべきではありません。このモデルはある程度機能させることができますが、かなりのオーバーヘッドがあり、スケーリングが非常に不十分です。

最後に、(私が思うに)最初の質問です。クライアントごとに異なるポートを使用する代わりに、すべてのクライアントに1つのポートを使用します。クライアントからの各要求は、サーバーが含む要求を実行するのに十分な情報を伝達します。サーバーは単一のポートでリッスンするだけで、到着時に各リクエストを処理します。これに複数のスレッドを割り当てることもできますが、それは一般的なスレッドプールである必要があります。つまり、関係するスレッドの数は構成の問題であり、全体的な設計(つまり、特定のIDのID)に論理的な影響はありません。スレッドには意味がありません。マンコアの8倍の大きなサーバーに移動する場合、スレッドを追加することは、全体的な設計を変更するのではなく、スレッドを構成するという単純な問題です)。

于 2010-10-17T17:32:22.887 に答える