【发布时间】:2012-01-29 02:55:22
【问题描述】:
我遇到了套接字问题。 我自己编写了两个简单的应用程序,一个服务器和一个客户端。 服务器只是等待 UDP 数据包到达,一旦发生,就会在控制台中打印出一些东西。 客户端向特定端点发送 UDP 数据包。
// 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 被转发到运行服务器的计算机,顺便说一句。
【问题讨论】:
-
这是正常的。大多数 NAT 路由器只对来自 WAN 的连接进行端口转发,而不是 LAN。如果有任何解决方法,这将取决于您的 NAT 路由器的型号,并且在这里将是题外话。