我遇到套接字问题。 我自己写了两个简单的应用程序,一个服务器和一个客户端。 服务器只是等待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被转发到运行服务器的计算机,顺便说一句。
答案 0 :(得分:1)
这似乎是NAT配置问题。您必须在路由器上配置nat以转发公共接口上带有特定端口(1337)的数据包以转发到服务器。因此,当您的朋友向您发送UDP数据包时,此功能正常。
但是你不能(不知道它是否可能)已经配置了相反的方式,意味着相同的UDP数据包进入内部接口。当您在同一台计算机上将数据包从服务器发送到客户端时就是这种情况。
当服务器和客户端(在一台机器或两台不同的机器上)都在您的内部网络上时,最好使用服务器的接口ID,而不是依赖于natting
答案 1 :(得分:0)
大多数路由器和调制解调器通常不会转发UDP流量 - 有关说明,请参阅http://www.gotroot.com/blogpost4-Why-your-should-never-forward-UDP-out-of-your-firewall。还可以尝试将客户端和服务器连接到同一个物理网络(井,子网),并尝试将数据报直接发送到服务器而不是转发它们。