gpt4 book ai didi

node.js - 无法将 UDP 发送回 NAT 后面的内部 PC

转载 作者:太空宇宙 更新时间:2023-11-03 22:37:36 25 4
gpt4 key购买 nike

我设置了两台电脑,一种是位于 NAT 后面的本地网络中的客户端,另一个是公共(public)网络上的服务器。

测试步骤是——1)客户端监听udp端口333332)服务器监听udp端口222221)客户端发送udp到服务器2)服务器收到数据并发送回来

当我在测试网络上测试代码时,一切正常。

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

这里是使用nodejs测试代码。

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

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 = require('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");

最佳答案

无法从外部访问经过 NAT 的计算机,这对于点对点或 friend 对 friend 软件来说尤其痛苦。基本上是因为您的 PC 没有公共(public) IP 地址,但 NAT 设备有。因此,NAT 是可见的,而您的 PC 则不可见。

服务器从 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 支持通用即插即用、端口映射协议(protocol)或端口控制协议(protocol)来实现此映射,并且您可以使用 Nodejs 来完成此操作,因为您所需要的只是向 NAT 发出相应的 HTTP 请求。

是的,你可以自己做,但并不那么容易。事实上,发现过程需要您在 LAN 中的特定端口上广播 udp 消息。我强烈建议您使用第三方组件来完成此操作。

希望这对您有帮助。

关于node.js - 无法将 UDP 发送回 NAT 后面的内部 PC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23544083/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com