2

現在、TCP を使用してパケットを送信するオンライン ビデオ ゲームを作成しようとしています。UDP を使用したいのですが、UDP を初めて使用するので、いくつか問題があります。

サーバー/クライアントを同じコンピューター (localhost) でテストすると、パケットが互いに干渉しているように見えます。

たとえば、クライアントがサーバー (UDP、127.0.0.1:1338) にパケットを送信した場合、クライアントはポート 1338 で 127.0.0.1 からのパケットもリッスンしているため、最終的にパケットを受信します。 2 つのクライアントと 1 つのサーバーをテストしようとすると、クライアントはサーバー宛てのパケットを送信する可能性がありますが、他のクライアントによって取得されます。

すべてのパケットが 127.0.0.1:1338 との間で送受信されているため、localhost で UDP をテストするにはどうすればよいですか? パケットがサーバー向けか特定のクライアント向けかを区別するために、パケットに何らかのレイヤーを実装する必要がありますか?

4

3 に答える 3

4

サーバーのみが、定義されたポート番号 (1338) でリッスンする必要があります。各クライアントは空きポート番号を選択し、サーバーにこのポート番号を送信する必要があります。サーバーは、クライアント情報を保存してから、このクライアント リスト内のクライアントにパケットを送信する必要があります。

クライアントは、クライアントが閉じているときに、サーバー側でどのクライアントがまだ利用可能で、どのクライアントがもう参加していないかを知るために、goodby パケットも送信する必要があります。

また、このクライアント リストに何らかのハウスキーピングを実装する必要があります。たとえば、クライアントから最後に受信したパケットのタイムスタンプを保存し、しばらくデータを送信していないクライアント (クライアントのクラッシュ、接続の切断など) をリストから削除します。

于 2013-09-03T06:38:08.873 に答える
3

サーバーが実際にパケットを取得しない可能性があるため、レイヤーを追加しても役に立ちません。

サーバーとクライアントのポートを構成可能にします。そうすれば、テスト用に同じマシンに異なるポートを用意し、本番環境に移行するときにそれを変更できます。クライアントとサーバーの両方で両方のポートを構成する必要があることを覚えておいてください。とにかく、これは良い習慣です。

同じマシンに複数のクライアントが存在し、同じポートをリッスンしているという別の問題がまだあります。クライアントごとにランダムなポートを持つことができます (クライアントはランダムに 1 つを選択し、サーバーに通知します)。または、別の IP アドレス (1 つは 127.0.0.1 を使用し、もう 1 つは PC の実際の IP を使用) へのバインドを試すこともできますが、拡張はできません。

于 2013-09-03T06:18:55.037 に答える
0

これを LAN セットアップで使用する場合は、送信者のアドレスに基づいて受信パケットをいつでもフィルタリングできます。UDP の recvmsg() を使用すると、送信者のアドレスとポート番号を取得できます。これを WAN セットアップで使用する場合、マルチキャストを実行しようとしない限り、これはおそらく問題にはなりません。また、マルチキャストを使用しても、重複したパケットは受信者に送り返されません。IP_MULTICAST_LOOP を使用して、このオプションを無効にすることができます。

于 2013-09-03T06:17:07.710 に答える