単純なチャットクライアントを作成しましたが、すべてのクライアント/サーバーが同じポートでポートフォワードされている場合にのみ機能します。
クライアントのポート転送を必要とせずにアプリケーション(c#で.netソケットを使用)を機能させるにはどうすればよいですか(サーバーがポート転送する必要があるかどうかは気にしません)。
ちなみにudpを使用しています。
単純なチャットクライアントを作成しましたが、すべてのクライアント/サーバーが同じポートでポートフォワードされている場合にのみ機能します。
クライアントのポート転送を必要とせずにアプリケーション(c#で.netソケットを使用)を機能させるにはどうすればよいですか(サーバーがポート転送する必要があるかどうかは気にしません)。
ちなみにudpを使用しています。
質問のタイトルが間違っていると思います。クライアントに接続するサーバーについて話しているのですね。
ソケットを直接操作している場合、簡単に言えば、できません。長い答えは、サーバーがそれに到達できるようにクライアントポートを開いたままにするような方法で、クライアントをサーバーに登録する必要があるということです。
これを自分で作成するのではなく、SignalRなど、これに焦点を当てたライブラリを検討してください。
その上、とにかく、UDP はチャット クライアントにとって恐ろしい選択です。UDP パケットに関するジョークはたくさんありますが、すべてを理解できるわけではありません。
2 つのエンドポイント間に NAT やファイアウォールがある場合、プログラムではなく、そのハードウェアが 2 つのエンドポイントが通信できるかどうかを決定します。
ただし、NAT およびファイアウォール ルールでは、多くの場合、ポート 80 およびその他のポート < 1024 の受信が許可されます。多くの場合、任意の送信ポートに到達できます。これを利用して、ネットワーク トポロジが通信をブロックする可能性を最小限に抑えることができます。実際、Skype の Advanced / Connection タブを見ると、Skype が着信接続にポート 80 と 443 を使用できるかどうかを示すチェックボックスがあることがわかります (この設定は、開発者のマシンの Web サーバーに干渉することがあります.. .)。
すべてのクライアントが接続する中間のどこかにサーバーが必要です。nat ボックスの背後にある 1 つのクライアントを、nat ボックスの背後にある別のクライアントに接続することはできません。どちらもサーバーに接続し、その接続を開いたままにしておく必要があります。次に、クライアント A はサーバーにメッセージを送信し、サーバーはそのメッセージをクライアント B に転送します。
NAT ルーター経由で通信する場合は、アプリケーション内から UPnP を使用してポート転送をセットアップできます。これは、たとえば torrent プログラムが、ポート転送を設定しなくても通信できる方法です。
.netでは、Windows の一部であるNATUPnP 1.0 タイプ ライブラリ(NATUPNP.DLL) COM コンポーネントを使用できます (Windows XP 以降)。
com コンポーネントへの参照を追加する
既存のすべてのポート マッピングのリストを取得する
NATUPNPLib.UPnPNATClass upnpnat = new NATUPNPLib.UPnPNATClass();
NATUPNPLib.IStaticPortMappingCollection mappings = upnpnat.StaticPortMappingCollection;
すべてのマッピングを繰り返す
foreach(NATUPNPLib.IStaticPortMapping portMapping in mappings)
{
// do something with the port mapping, such as displaying it in a listbox
}
新しいポート マッピングを追加する
// Here's an example of opening up TCP Port 80 to forward to a specific Computer on the Private Network
mappings.Add(80, "TCP", 80, "192.168.1.100", true, "Local Web Server");
// Here's an example of forwarding the UDP traffic of Internet Port 80 to Port 8080 on a Computer on the Private Network
mappings.Add(80, "UDP", 8080, "192.168.1.100", true, "Local Web Server");
ポート マッピングの削除
// Remove TCP forwarding for Port 80
mappings.Remove(80, "TCP");
// Remove UDP forwarding for Port 8080
mappings.Remove(8080, "UDP");