【问题标题】:Connecting to own PC using public IP使用公共 IP 连接到自己的 PC
【发布时间】: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 路由器的型号,并且在这里将是题外话。

标签: c# sockets


【解决方案1】:

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

但是你不能(甚至不知道它是否可能)已经配置了相反的方式来表示相同的 UDP 数据包进入内部接口。当您在同一台机器上将数据包从服务器发送到客户端时就是这种情况。

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 感谢您的回答。只是好奇,您的链接描述了 UDP 打孔,不是吗?
    • OP 说他能够通过他的路由器从公共互联网接收 UDP 数据包到他的内部 LAN 连接的 PC。因此,在这种情况下,您关于路由器通常不转发 UDP 流量的回答是错误的!
    • @user1046192:是的,确实如此。它也是许多应用程序(包括 Skype、IIRC)使用的技术,允许通过 NAT 和防火墙进行直接的端到端通信。
    猜你喜欢
    • 2013-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    • 1970-01-01
    • 2011-08-08
    • 1970-01-01
    相关资源
    最近更新 更多