UDP多广播节点

时间:2015-11-23 00:00:04

标签: javascript node.js sockets udp

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

我认为每个客户端都需要两个套接字,一个用于发送消息,另一个用于接收消息。

最简单的是,这就是我现在所拥有的:

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

(不要介意回声,那将构建在顶层的应用程序逻辑)

这会将消息回显给运行代码的人,但我也同时在同一台机器OS X上的linux VM上运行它,但是没有看到传递的消息

我不确定这是否意味着

1)我的代码不正确

2)虚拟机与其主机具有相同的网络?

3)代码是否正确但我的家用路由器阻止了多播广播?

1 个答案:

答案 0 :(得分:2)

啊,我找到了重复使用端口地址的巧妙技巧。

"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进行通信。