首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用公网IP连接到自己的PC

使用公网IP连接到自己的PC
EN

Stack Overflow用户
提问于 2012-01-29 10:55:23
回答 2查看 1.2K关注 0票数 0

我的套接字出了点问题。我已经为自己编写了两个简单的应用程序,一个服务器和一个客户端。服务器只是简单地等待UDP数据包到达,一旦发生这种情况,就会在控制台中打印出一些东西。客户端将UDP数据包发送到特定端点。

代码语言:javascript
复制
// 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。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-01-29 11:04:51

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

票数 0
EN

Stack Overflow用户

发布于 2012-01-29 11:22:38

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

但是您一定不能(甚至不知道它是否可能)以相反的方式配置natting,这意味着相同的UDP数据包到达内部接口。当您在同一台计算机上将数据包从服务器发送到客户端时,就会出现这种情况。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9050533

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档