当前位置: 首页 > 知识库问答 >
问题:

无法将UDP发送回NAT后的内部PC

法景明
2023-03-14

我设置了两台PC,一台是本地网络中的客户端,另一台是公共网络上的服务器。

测试步骤是 -- 1) 端口 33333 上的客户端侦听 udp 2) 端口 22222 上的服务器侦听 UDP 1) 客户端将 udp 发送到服务器 2) 服务器收到数据并发回

当我在我的测试网络上测试代码时,它是正常的。

如果把服务器放在真正的互联网上,服务器可以从客户端获取消息,客户端无法从服务器获得响应。怎么了?

下面是用nodejs测试代码。

服务器var dgram=require('gram');

var socket = dgram.createSocket('udp4');
socket.on('message', function (message, remote) {
        console.log('client ip:' + remote.address + ', port:' + remote.port +', message:' + message);
        //send response to client
        var message = new Buffer("hello, client!");
        socket.send(message, 0, message.length, remote.port, remote.address);
});

//listening port
socket.bind(22222);

客户端var dgram=要求('dgram');

var socket = dgram.createSocket('udp4');

socket.on('message', function (message, remote) {
        //display message from server
        console.log('server ip:' + remote.address + ', port:' + remote.port +', message:' + message);
});

//listening port
socket.bind(33333);

//send message to server
function send(server){
        var message = new Buffer("hello, server!");
        socket.send(message, 0, message.length, 22222, server, function(){
                //send again after 1 seconds
                setTimeout(function(){
                        send(server);
                }, 1000);
        });
};

//suppose that server address is public.server.com
send("public.server.com");

共有1个答案

澹台华翰
2023-03-14

无法从外部访问NAT计算机,这对于点对点或朋友对朋友软件来说尤其痛苦。基本上是因为你的电脑没有公共IP地址,但你的NAT设备有。所以,NAT是可见的,而你的电脑是不可见的。

服务器从NAT设备获取数据包,并向其发送响应。是的,NAT接收到响应,它必须把它转发给你的PC,这就是诀窍。为此,您必须在NAT中配置端口转发。

NAT有一个如下表:

+----------+---------------------+---------------+ 
| NAT PORT | INTERNAL IP ADDRESS | INTERNAL PORT | 
+----------+---------------------+---------------+
|   33333  | 198.162.0.3 (pc ip) |       33333   |

它可以被理解为:当NAT在其端口#33333接收到一个包时,它必须被重定向到内部IP 198.162.0.3(你的PC IP地址)和端口# 33333。

如果您的PC使用固定IP,您可以在NAT中手动执行此映射。但是,如果您使用DHCP服务器,您的PC的IP可能会在每次重新启动后更改,因此您需要在项目中通过软件进行此映射。大多数NAT支持通用插头

是的,你可以自己做,但这并不容易。事实上,发现过程要求你在局域网中的特定端口广播udp消息。我强烈建议您使用第三方组件来完成这项工作。

我希望这对你有所帮助。

 类似资料:
  • 问题内容: 我试图在Java中实现UDP-Holepunching的简单草图以测试其概念,并稍后在我的C / C ++应用程序中使用它。 从Wikipedia来说,我的理解是:A和B是未定义网络结构背后的客户端,C是著名的公共可访问服务器。 A将数据包发送到服务器C,服务器保存其IP地址和端口。C将获得A的NAT的公共IP地址。这样做,A前面的NAT将创建一条路由,该路由会将此端口上的所有数据包传

  • 我已经读过一些关于端口转换的内容,现在我想测试它。 我有一台NAT路由器后面的本地机器和一台带有外部IP地址的服务器。 这就是我如何将数据包从机器上的第5000个端口发送到服务器上的第4000个端口。 之后,我开始在本地机器上收听第 5000 次 在服务器上,当我看到来自的传入UDP时,我会向相同的和 发送响应(对其他端口和地址使用相同的脚本)。但我从未在本地机器上收到此响应。为什么? 此外,当服

  • 问题内容: 即使已经存在一个类似的主题,我也注意到它可以追溯到两年前,因此我认为打开一个新主题更为合适。 我试图弄清楚如何从Linux内核(3.3.4)发送UDP数据包,以便监视随机数生成器(/drivers/char/random.c)的行为。到目前为止,由于sock_create和sock_sendmsg函数,我已经设法监视了一些事情。您可以在此消息的末尾找到我使用的典型代码。(您可能还希望在

  • 我正在编写一个基于UDP的客户端服务器,并且已经获得了很多代码,但是我对UDP服务器如何将响应发送回UDP客户端感到困惑,这是我到目前为止的理解: 假设UDP客户端希望与UDP服务器通信,因此它将向UDP服务器发送请求(使用在客户端打开的UDP套接字),现在这将到达UDP服务器上的UDP模块,其中UDP模块将使用端口号标识UDP服务,并将该请求发送到该UDP服务/服务器 我的困惑是,在服务器端,有

  • 问题内容: 我正在开发一个Go程序,该程序发出UDP广播以查询本地网络上设备的存在,然后读取答复。使用Wireshark,我确认该数据包已广播,并且(我)网络上的单个设备已答复(实际上是10次),但我的应用程序在读取时被阻止,好像它看不到传入的数据包。这是代码: checkErr(err)打印诊断信息,如果err不为零,则退出。 答复中的信息如下: 我尝试用“ 0.0.0.0:10000”、“:1

  • 我尝试使用Spring Integration实现UDP服务器,就像这里描述的那样,但是当客户端在NAT之后运行时,它们将永远不会收到来自服务器的响应。这是因为服务器应该从与UDP适配器端口相同的端口发送响应数据报(通过这里解释的NAT检查UDP)。 如何使用Spring Integration实现与NAT后客户端的正确UDP通信?