2012-01-29 23 views
0

ソケットに問題があります。 私は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は、サーバーが稼働しているコンピュータに転送されます。

+1

をnattingに応じたよりも、サーバーのインタフェースIDを使用するのがベストでしょう。ほとんどのNATルータは、LANではなくWANからの接続に対してのみポート転送を行います。回避策があれば、それはNATルータのモデルに依存し、ここで話題にならないでしょう。 –

答えて

0

ほとんどのルータとモデムは、通常UDPトラフィックを転送しません。詳細については、http://www.gotroot.com/blogpost4-Why-your-should-never-forward-UDP-out-of-your-firewallを参照してください。また、クライアントとサーバーの両方を同じ物理ネットワーク(よくあるサブネット)に接続し、データグラムを転送するのではなくサーバーに直接送信してみてください。

+0

あなたの答えをありがとう。好奇心をそそられるだけで、あなたのリンクはUDP穴あけを説明していますね。 – haiyyu

+0

OPは、パブリックインターネットからルーターを介して内部LAN接続されたPCにUDPパケットを受信できると述べています。したがって、ルータが通常UDPトラフィックを転送しないというあなたの答えは、この場合は間違っています! –

+0

@ user1046192:はい、そうです。また、NATやファイアウォールを介した直接エンドツーエンド通信を可能にするために、Skype、IIRCなどの多くのアプリケーションで使用されている技術です。 – Jashank

1

これはNAT設定の問題のようです。特定のポート(1337)を持つパブリックインターフェイス上のパケットを転送して、サーバーに転送するには、ルーターでnatを構成する必要があります。これは、あなたの友人があなたにUDPパケットを送るときに機能します。

しかし、(たとえ可能であれば)わからないで、内部インターフェイスに送信される同じUDPパケットを意味して、他の方法でネッキングを設定してはいけません。これは、同じマシン上の両方でサーバーからクライアントにパケットを送信する場合です。 (単一のマシンまたは2台の異なるマシン上の)サーバとクライアントの両方が内部ネットワーク上にある場合

それはこれが正常である

関連する問題