无法将备份发送到 NAT 后的内部 PC
Posted
技术标签:
【中文标题】无法将备份发送到 NAT 后的内部 PC【英文标题】:Can not send back UDP to internal PC behide NAT 【发布时间】:2014-06-25 23:33:51 【问题描述】:我设置了两台电脑, 一个是本地网络中的客户端,位于 NAT 后面, 另一个是公共网络上的服务器。
测试步骤是—— 1) 客户端在 33333 端口监听 udp 2) 服务器在 22222 端口监听 udp 1)客户端发送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");
【问题讨论】:
【参考方案1】:无法从外部访问经过 NAT 的计算机,这对于点对点或朋友对朋友的软件来说尤其痛苦。基本上是因为您的 PC 没有公共 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 都支持通用即插即用、端口映射协议或端口控制协议来实现这种映射,并且您可以使用 nodejs 来实现,因为您只需要向 NAT 发出适当的 HTTP 请求。
是的,你可以自己做,但这并不容易。实际上,发现过程需要您在 LAN 中的特定端口广播 udp 消息。我强烈建议您使用第三方组件。
我希望这对你有帮助。
【讨论】:
以上是关于无法将备份发送到 NAT 后的内部 PC的主要内容,如果未能解决你的问题,请参考以下文章
无法使用 java 套接字将图像从 android studio 发送到 pc,filePath 返回 null