0

私のプロジェクトについてアドバイスをいただきたいです。私は現在、C++/Qt でマルチプレイヤー モードを使用して音楽アプリケーション/ゲームを開発しており、次の要件があります (理想的には)。

  • 友達と連絡を取り、チャットしたり遊んだりしたい
  • これらの連絡先にリアルタイム データを送受信する必要があります (音楽ノート)
  • サーバー アプリケーションを作成したくない

これを行うには何をお勧めしますか?

xmpp プロトコルを使用することを考えていたので、google/jabber に接続して連絡先を取得し、チャットできます。実際、この部分は機能しますが、リアルタイム データを送受信する方法がわかりません。リアルタイム部分については、直接TCP通信を使おうと考えていましたが、連絡先の外部IPを知る必要があり、その方法がわかりません。接続するたびに外部 IP と TCP ポートをすべての連絡先に自動的に送信することを考えていましたが、コードから外部 IP を取得する解決策が見つかりませんでした。だから私は少し立ち往生しています。何かアドバイス?

代替ソリューションはありますか?代替プロトコル?

ありがとう、
ローラン

4

1 に答える 1

2

現実的、実用的、およびパフォーマンス上の理由から、サーバーの作成を避けるのは非常に困難です。

  1. 多くの家庭用インターネット接続は、ネットワークの外部からの接続の受け入れを制限するファイアウォール (ISP、ローカル ルーター、または OS レベル) の背後にあります。NAT は、LAN 上のインターネットからの接続を受け入れることをさらに複雑にします。

  2. サーバーレスのインターネット通信の方法はほとんどなく、ピアを見つけるためにローカル ピア ディスカバリを使用する必要があります。ほとんどの LPD トラフィックは LAN の外に出ることはなく、ISP がフィルタリングします (そうしないと、インターネット全体で「ローカルに」ピアを検出できます)。

  3. ゲームでは、帯域幅が問題になる場合があります。誰もが高速インターネット接続をまだ持っているわけではありません (ただし、光ファイバーと高速 DSL の市場への普及率は現時点ではかなり高いですが)。

  4. サーバーは、非常に効率的なスターのようなネットワークを促進します。他のネットワーク トポロジも存在しますが、その多くは拡張性を著しく阻害する欠点に悩まされています。

    • たとえば、クライアントのスター ネットワークでは、O(接続数) = O(1)、O(帯域幅) = O(1)、O(レイテンシ) = O(1) が必要です。

    • 完全に接続されたネットワークでは、すべてのクライアントが他のすべてのクライアントに接続されている必要があるため、O(接続) = O(帯域幅) = O(n)、O(レイテンシ) = O(1) となります。

    • リング ネットワークでは、各クライアントが 2 つのネイバーに接続し、離れたクライアントのメッセージが転送されます。したがって、O(接続数) = O(1) ですが、O(帯域幅) = O(レイテンシ) = O(n) になります。

チャット システムだけが必要な場合、またはオンライン エクスペリエンス全体をチャット サーバーに便乗させたいという理由で独自のサーバーを作成したくない場合は、おそらく XMPP サーバーのようなものに頼ることができます。

その方法を選択する場合は、ユーザーの個人データ (パスワードなど) を保護するために必要な場所で、適切な認証と暗号化が使用されていることを確認してください。クライアントが他のクライアントを認証できるようにする暗号化認証スキーム (チャレンジ/レスポンス スキームなど) を使用することをお勧めします。または、すべての認証を中央サービスで仲介することもできます。

多くのチャット サービスは、プロジェクトに無料の帯域幅を提供したくないことに注意してください。XMPP をマルチプレイヤー プロトコルの中心として使用することにした場合でも、独自のサーバーを実行することを期待してください。

于 2013-06-05T21:59:21.170 に答える