提问者:小点点

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


我设置了两台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个答案

匿名用户

无法从外部访问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消息。我强烈建议您使用第三方组件来完成这项工作。

我希望这对你有所帮助。