6

サーバーがあり、クライアントがサーバーに接続されているとします。サーバーは、パブリック IP を介してアクセスできます。

サーバーを介さずにクライアントが互いに直接接続されるように、接続を「転送」したいと思います。

これが可能かどうかはまったくわかりませんし、私自身もそれを行う方法を見つけることができませんでした。

その他の仮定:

  • どちらのクライアントもパブリック IP を持っておらず、両方のクライアントが NAT の背後にあります
  • 必要に応じて、さらに多くの接続を開始できます

ルーターを再構成したり、ポートを開いたりする必要のない、厳密なソフトウェア ソリューションを探しています。

これを実現したい理由は、サーバーの負荷を軽減するためです。2 つのクライアントが関連付けられると、(技術的なものを除いて) サーバーを一種のプロキシとして使用し続ける必要はありません。直接のクライアント接続により、接続の待ち時間も短縮されます。

4

4 に答える 4

4

http://en.wikipedia.org/wiki/UDP_hole_punchingをご覧ください。どちらのマシンにもパブリック IP がなく、ポートを開くことができず、すべてのデータがサーバーを通過したくない場合は、おそらくこれが唯一の可能なオプションです。これがうまくいかない場合は、サーバーを通過するすべてのデータに行き詰まっている可能性があります。ポート転送を設定できる場合は、それがより良い解決策になります。サーバーを使用して、IP とポート情報を交換します (接続が確立された時点で存在するため)。

于 2013-05-29T11:03:45.497 に答える
3

簡単に言えば、それは不可能です。

主な問題の 1 つは、ルーターがサーバー (または他のクライアント) からの要求をリダイレクトする場所がわからないことです。ほんの一例:背後に複数のデバイス(コンピューター、携帯電話など)があるルーターがあります。リクエストを受け取りますが、誰がリクエストを受け取りたいかわかりません。

そのための回避策がありますが、信頼性は高くありません (常に機能するとは限りません)。可能であれば使用する企業もありますが、失敗した場合は常に代替手段 (サーバー経由の通信など) があります。ナットパンチといいます。詳細はこちら: http://en.wikipedia.org/wiki/TCP_hole_punching

どのような理由で必要なのかわかりません。クライアントサーバー接続に必要な場合は、ロングポーリング、コールバックなどを使用できます....

それ以外の場合は、ルーターを設定するか、サーバー経由でルートを取る必要があります。

于 2013-05-29T11:06:30.927 に答える
1

一部の家庭用ルーターは upnp をサポートしており、特定のポートを開いて LAN 上の特定のクライアントに転送するように指示できます。

GNU/Linux でupnpcを使用して、ルーターのポートを開くことができます。また、C コードから実行するためのライブラリもあります (ただし、十分に文書化されていません)。

ただし、この方法はすべての家庭用デバイスで機能するとは限らないため、その場合は他の回答を参照してください。

于 2013-05-29T11:11:46.000 に答える