2015-11-23 167 views
1

我想创建一个基于UDP多播广播的聊天程序,这个想法是任何在本地网络上的人都可以弹出并开始输入和发送消息。UDP多广播nodejs

我觉得每个客户端都需要两个套接字,一个发送消息,一个接收消息。

简单地说,这是我现在有:

"using strict"; 

const multicast_addr = "224.1.1.1", 
     bin_addr = "0.0.0.0", 
     port = 6811; 

var udp = require("dgram"); 

var listener = udp.createSocket("udp4"), 
    sender = udp.createSocket("udp4"); 

listener.bind(port, multicast_addr, function(){ 
    listener.addMembership(multicast_addr); 
    listener.setBroadcast(true); 
}); 

listener.on("message", function (b, other) { 
    console.log(b.toString().trim()); 
}); 

process.stdin.on("data", function (data){ 
    sender.send(data, 0, data.length, port, multicast_addr); 
}); 

(没关系回声,这是一个将在上面构建的应用程序逻辑)

这将回显邮件回运行代码的人,但我也同时在同一台机器上的Linux VM上运行这个OS X,但是根本没有看到消息被传递。

我不知道这意味着

1)我的代码是不正确

2)虚拟机具有相同的网络作为自己的主机?

3)代码是正确的,但我的家庭路由器阻止多广播数据包?

回答

1

啊,我发现这个重复使用端口地址的巧妙技巧。

"using strict"; 

const multicast_addr = "224.1.1.1", 
     bin_addr = "0.0.0.0", 
     port = 6811; 

var udp = require("dgram"); 

var listener = udp.createSocket({type:"udp4", reuseAddr:true}), 
    sender = udp.createSocket({type:"udp4", reuseAddr:true}); 

listener.bind(port, multicast_addr, function(){ 
    listener.addMembership(multicast_addr); 
    listener.setBroadcast(true); 
}); 

listener.on("message", function (b, other) { 
    console.log(b.toString().trim()); 
}); 

process.stdin.on("data", function (data){ 
    sender.send(data, 0, data.length, port, multicast_addr); 
}); 

致力于让OS X通过本地网络与非VM Ubuntu进行通信。

+0

你的意思是绑定到'bin_addr',然后将成员添加到'multicast_addr'?似乎'bin_addr'永远不会被使用。我也尝试这样做。 – snakeoil