0

私の友人がLANでプレイできる小さなゲームを作って、インターネットでプレイできるように変更するように頼みました。クライアントアプリケーションに大きな変更を加えたくありません。

ゲームが作成されると、サーバーはUDP BROADCASTパケットを送信し続け、ゲームが作成されたことを全員に通知します。ここで、これらのパケットをインターネットIPアドレスのグループに送信するために、このBROADCASTを変更する必要があります。

次の解決策が適切かどうかを教えてください。ルームサーバーを作成し、「room-broadcast-server」と呼びます。これには、ルームに参加したすべての人のIPアドレスが含まれます。次に、クライアントはそのBROADCASTパケットを送信する代わりに、そのパケットをroom-broadcast-serverに送信し、room-broadcast-serverはこのパケットをルームに参加したすべての人にブロードキャストします。

問題は次のとおりです。クライアントはこれらのパケットを「room-broacast-server」から受信し、ゲームを作成したマシンと通信する代わりに、room-broadcast-serverと通信しようとします。クライアントをだまして、パケットがroom-broadcast-serverからではなく、ゲームサーバーから来たと思わせるようにします。どうすれば作れますか?

4

3 に答える 3

1

送信元アドレスのなりすましは、通常のアプリケーションプロトコルに適したメカニズムではありません。これには、クライアントマシンに対する特別なアクセス許可が必要であり、一部のネットワークフィルターによって削除され、一般的には粗雑で反社会的です。

とにかくクライアントを変更しているので(ブロードキャストアドレスではなくゲームサーバーにメッセージを送信するため)、ゲームサーバーに送信する各パケットにパケットの「真のソース」を追加させるだけで済みます。クライアントは、ゲームサーバーから受信するパケットでこの情報を期待して処理します。

于 2010-07-19T02:07:28.993 に答える
1

サーバーのみを変更しますか、それともサーバークライアントの両方を変更しますか? サーバーのブロードキャストに依存するのではなく、ブロードキャストを完全に削除し、クライアントに接続先のサーバーを明示的に選択させる方が簡単だと思います。

バージョン 1 として、プレイヤーが接続するためにクライアントにサーバーの IP アドレス/DNS 名を入力することを要求するだけで済みます。

バージョン 2 では、クライアントとサーバーの両方がお互いを見つけるために接続する (既知の) 中央ロビー サーバーがある "ロビー" のサポートを追加できます (そのため、サーバーはロビーに接続してその存在を通知し、次にクライアントを通知します)。接続したいサーバーを参照するためにロビーに接続します)。

私が書いているゲームで (しかし、現在は自由時間がないため保留中です :p) 「ロビー」サーバーを単純な PHP+MySQL Web アプリケーションとして作成し、クライアントとサーバーに HTTP リクエストを使用してそれをポーリングさせました。更新などのために。そうすれば、安価な Web ホストで中央ロビー サーバーをホストでき、誰でもゲームをホストできます (欠点は、安価な Web ホストでは任意のソケット接続が許可されないため、NAT パンチスルーを実装できませんでした)。 、しかし、ゲームが人気になった場合、私の計画は、ロビーサーバーを、任意のソケット接続を許可するより高価なホストに移動することでした...)

于 2010-07-18T23:56:41.217 に答える
0

ディーンの2番目のオプションの基本概念(1つの中心的なロビーサーバー+複数のゲームサーバー)は優れており、小売オンラインゲームでも非常に一般的です。私が理解していないことの1つは、なぜIPアドレスを偽造したいのかということです。クライアントは、サーバーのIPアドレスから有効なパケットを取得する限り、サーバーのIPアドレスを気にする必要はありません。また、imo、クライアントはロビーサーバーを介して接続されているため、ゲームサーバーはクライアントのリストを管理できる/管理する必要があるため、別の部屋(?)サーバーを作成する必要はありません。

于 2010-07-19T07:15:50.210 に答える