実際、それは可能です。「UDP ホール パンチング」または「TCP ホール パンチング」と呼ばれるものをググるとよいでしょう。
簡単に言えば、主なアプローチ: リレー サーバーのようなものがあると仮定します。これは、www. いいえ、2 つのクライアント A と B が (異なる) プライベート LAN にあり、ネットワーク アドレス変換 (NAT) が行われており、ピア ツー ピア接続を確立したいと考えています。
まず最初に、両方がサーバーに自分の IP アドレスと自分の LAN にあるポートを伝えます。UDP または TCP パケットで、サーバーはデバイス (または NAT (ルーター)) のパブリック アドレスとポートを見つけます。したがって、サーバーはプライベート IP アドレスとパブリック IP アドレス、およびポートを認識します。
A が B と通信したい場合、サーバーに助けを求めます。サーバーは、A が B と通信したいというメッセージを B に送信し、A のパブリックおよびプライベート IP とポートを伝えます。A は、B の公開および非公開の情報とポートを取得します。
ここで魔法が起こります。両方のクライアントがパケットを送信して、相手のプライベート アドレスとパブリック アドレスに同時に接続を確立し、着信接続がブロックされないように、NAT 全体をパンチします。この全体が作成される前に一方のパーティの接続確立パケットが到着したとしても、他方のパケットは接続を作成できるように通過します。
IP アドレスのデータをスキャンして変換する一部の NAT には注意してください。
主な質問は、サーバーがアクティブな接続なしでクライアントの 1 つとどのように通信できるかということです。この場合、「接続反転」とアップルの「プッシュ通知」を使用できます。「プッシュ通知」(pn) を使用して、NAT の背後にあるクライアントに、関心のあることが起こっており、サーバーに連絡する必要があることを伝えます。接続がアクティブになると、前述の方法で使用できるようになります。
投稿はかなり古いですが、これがこの問題に遭遇した一部の人々に役立つことを願っています!