不能将UDP发回到内部的PC上,

我安装了两台PC,一台是局域网内的客户端,另一台是公网上的服务器。

testing步骤是 – 1)客户端监听端口33333上的udp 2)服务器端口22222监听udp 1)客户端发送udp到服务器2)服务器接收到数据并发回

当我testing我的testingnetworking上的代码时,没关系。

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

这里是用nodejstesting代码。

server 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的计算机,这对于点对点或朋友对朋友的软件尤其痛苦。 基本上,因为你的电脑没有公共IP地址,但你的NAT设备。 所以,NAT是可见的,你的电脑不是。

服务器从NAT设备获取包并将响应发送给它。 是的,NAT收到回应,它必须传递给你的电脑,这就是诀窍。 为此,您必须在NAT中configuration端口转发。

NAT具有如下的表格:

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

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

如果您的电脑使用固定IP,您可以在NAT中手动执行此映射。 但是,如果您使用DHCP服务器,则每次重新启动后,您的PC的IP都会更改,因此您需要在项目中通过软件进行映射。 大多数NAT支持通用即插即用,端口映射协议或端口控制协议来实现此映射,并且您可以使用nodejs来完成此操作,因为您只需要向NAT发送所需的HTTP请求。

是的,你可以自己做,但不是那么容易。 实际上,发现过程要求你在局域网中的特定端口上广播udp消息。 我强烈build议您使用第三方组件来做到这一点。

我希望这可以帮助你。

Interesting Posts