2016-08-23 64 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不会回送和确认数据包。

相关问题