2016-08-23 98 views
1

我正在使用Nodejs的dgram模塊運行簡單的UDP服務器。 相關的代碼很簡單:Node.js DGRAM模塊:無法將UDP消息發送到遠程計算機,但可以到本地計算機

 server = dgram.createSocket('udp4'); 
    server.bind(10022,'127.0.0.1'); 

當我在本地機器上NETSTAT,使用這樣的:

sudo netstat -l 

我看到這個條目:

Proto Recv-Q Send-Q Local Address  Foreign Address   State 
udp  0  0 localhost:10022  *:* 

當我從一個做NMAP遠程機器使用接口的IP地址:

sudo nmap -sU -p 10022 192.168.7.171 

我看到這一點:

Nmap scan report for 192.168.7.171 
    Host is up (0.00032s latency). 
    PORT  STATE SERVICE 
    10022/udp closed unknown 

我有,當我使用server.bind(10022,「127.0.0.1」)的正常工作在同一臺機器上運行的UDP客戶端代碼,如上面完成。它不會在我使用分配給接口的真實IP地址時使用。

我也想使用遠程機器的客戶端代碼。所以,當我使用server.bind(10022,'192.168.7.171')代替server.bind(10022,'127.0.0.1')時,我希望能夠從遠程發送消息到UDP進程機。我不能。有趣的是,遠程機器上的send函數的回調也不會返回錯誤。

如何獲取遠程機器上的客戶端代碼發送消息到UDP服務器。所有防火牆都已關閉進行測試,因爲我最初懷疑它是防火牆問題。無論如何,這兩臺機器在測試期間都位於本地Intranet上。

+0

「地址」是可選的,如果你沒有指定它「綁定」嘗試偵聽所有本地地址,它是否以這種方式工作?對於錯誤UDP默認情況下不可靠,一旦發送數據包,協議就不會發回確認。 – aghidini

+0

@aghidini你的建議奏效!謝謝。我讀過「當地址和端口沒有傳遞給socket.bind()時,該方法會將套接字綁定到隨機端口上的」all interfaces「地址(它對udp4和udp6套接字都是正確的)地址和端口可以使用socket.address()。address和socket.address()。port。「來檢索。」在節點文檔中,但沒有意識到您可以指定端口並跳過地址。 **如果您可以發表您的評論作爲答案,將非常樂意接受它。**關於回調中錯誤的評論也是有意義的。 – Sam

+0

高興地幫助,但我不知道爲什麼它不工作通過指定另一個本地地址,如在你的例子中,它應該也適用於這種情況。 – aghidini

回答

1

bind()address參數是可選的,您可以嘗試通過忽略它來偵聽所有本地地址(0.0.0.0),但仍指定端口。例如:

server.bind(10022); 

關於失蹤的錯誤UDP是默認情況下不可靠的協議,當它通過線路傳輸的傳輸將被視爲成功。如果你需要一個可靠的通道,你可以使用TCP,UDP不會回送和確認數據包。

相關問題