2014-05-08 34 views
2

我設置了兩臺PC, 一個是客戶端在本地網絡中的NAT, 另一個是公網上的服務器。不能發回UDP給內部PC behide NAT

測試步驟 - 1)客戶端監聽udp,端口33333 2)服務器監聽端口UDP 22222 1)客戶端發送UDP到服務器 2)服務器接收的數據,併發送回

當我在我的測試網絡上測試代碼時,沒關係。

如果把服務器真正的互聯網上,服務器可以從客戶端的消息, 客戶端無法從服務器獲取響應。 有什麼問題?

以下是使用nodejs測試代碼。

服務器 變種DGRAM =要求( '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); 

client 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"); 

回答

0

NATed計算機無法從外部訪問,這對於點對點或朋友對朋友軟件來說尤其痛苦。基本上,因爲你的電腦沒有公共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(你的電腦IP地址)和33333.

如果您的電腦使用固定IP端口號,你可以做你的NAT手工這種映射。但是,如果您使用DHCP服務器,則每次重新啓動後,您的PC的IP都會更改,因此您需要通過項目中的軟件進行映射。大多數NAT支持通用插件&播放,端口映射協議或端口控制協議來實現此映射,並且您可以使用nodejs執行此操作,因爲您需要的只是向NAT提供的相關HTTP請求。

是的,你可以自己做,但它也不是那麼容易。實際上,發現過程要求您在局域網中的特定端口上廣播udp消息。我強烈建議您使用第三方組件來執行此操作。

我希望這可以幫助你。