ソケットに問題があります。 私は1つのサーバーと1つのクライアントという2つの単純なアプリケーションを作成しました。 サーバは単にUDPパケットが到着するのを待って、コンソールに何か起こったときにそれを一度プリントします。 クライアントは特定のエンドポイントにUDPパケットを送信します。パブリックIPを使用して自分のPCに接続
// server
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
sock.Bind(new IPEndPoint(IPAddress.Any, 1337));
IPEndPoint remote = new IPEndPoint(IPAddress.Any, 0);
byte[] buf = new byte[1024];
sock.ReceiveFrom(buf, ref remote);
Console.WriteLine("Received packet.");
// client
Socket sock = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
IPEndPoint remote = new IPEndPoint(IPAddress.Parse(Console.ReadLine()), UInt16.Parse(Console.ReadLine()));
byte[] buf = { 1, 2, 3, 4 }; // random data
sock.SendTo(buf, remote);
今、奇妙なことは、クライアントソケットは、私のルータのパブリックIPアドレスにそのパケットを送信するときに、クライアントがサーバと同じPC上で実行されていない場合は、サーバソケットのみがそれを受信することです。私のPC上でサーバを起動してから、私のPC上でクライアントを起動し、パブリックIPとポート1337を入力すると、サーバは何も受信しません。 しかし、クライアントアプリケーションを友人に送り、私にIPアドレスとポートを与えても、それは問題なく動作します。 クライアントを自分のローカルIPの代わりに自分のローカルIPに接続させる場合にも機能します。
私は唯一この現象が発生していますか? ポート1337は、サーバーが稼働しているコンピュータに転送されます。
をnattingに応じたよりも、サーバーのインタフェースIDを使用するのがベストでしょう。ほとんどのNATルータは、LANではなくWANからの接続に対してのみポート転送を行います。回避策があれば、それはNATルータのモデルに依存し、ここで話題にならないでしょう。 –