我的套接字出了点问题。我已经为自己编写了两个简单的应用程序,一个服务器和一个客户端。服务器只是简单地等待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被转发到运行服务器的计算机,btw。
发布于 2012-01-29 11:04:51
大多数路由器和调制解调器通常不转发UDP流量--有关说明,请参阅http://www.gotroot.com/blogpost4-Why-your-should-never-forward-UDP-out-of-your-firewall。还要尝试将客户端和服务器连接到同一物理网络(子网),并尝试将数据报直接发送到服务器,而不是转发它们。
发布于 2012-01-29 11:22:38
这似乎是NAT配置问题。您必须在路由器上配置nat,才能通过特定端口(1337)将来自公共接口的数据包转发到服务器。因此,当你的朋友向你发送UDP数据包时,这是有效的。
但是您一定不能(甚至不知道它是否可能)以相反的方式配置natting,这意味着相同的UDP数据包到达内部接口。当您在同一台计算机上将数据包从服务器发送到客户端时,就会出现这种情况。
当服务器和客户端(在一台机器或两台不同的机器上)都在您的内部网络上时,最好使用服务器的接口id,而不是依赖于natting
https://stackoverflow.com/questions/9050533
复制相似问题