使用公共IP连接到自己的电脑

本文关键字:自己的 电脑 连接 IP | 更新日期: 2023-09-27 18:21:39

我的套接字有问题。我为自己编写了两个简单的应用程序,一个服务器,一个客户端。服务器只是等待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上启动客户端,输入我的公共IP和端口1337,服务器将不会收到任何信息。但是,如果我把客户端应用程序发送给我的朋友,并给他我的IP地址和端口,它就可以很好地工作。如果我让客户端连接到我的本地IP而不是我的公共IP,它也会起作用。

我是唯一一个经历这种行为的人吗?端口1337被转发到运行服务器的计算机上。顺便说一句,

使用公共IP连接到自己的电脑

这似乎是NAT配置问题。您必须在路由器上配置nat,以转发来自具有特定端口(1337)的公共接口的数据包,然后转发到服务器。因此,当你的朋友向你发送UDP数据包时,这是有效的。

但你一定没有(不知道这是否可能)配置成另一种方式,这意味着相同的UDP数据包会到达内部接口。当您在同一台机器上从服务器向客户端发送数据包时,就会出现这种情况。

当服务器和客户端(在一台机器或两台不同的机器上)都在您的内部网络上时,最好使用服务器的接口id,而不是依赖于

大多数路由器和调制解调器通常不转发UDP流量--请参阅http://www.gotroot.com/blogpost4-Why-your-should-never-forward-UDP-out-of-your-firewall以获得解释。同时尝试将客户端和服务器连接到同一物理网络(好吧,子网),并尝试将数据报直接发送到服务器,而不是转发它们。