【问题标题】:UDP multi broadcast nodejsUDP多广播nodejs
【发布时间】:2026-01-20 06:00:01
【问题描述】:

我正在尝试创建一个基于 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) 代码正确,但我的家庭路由器阻止了多广播数据包?

【问题讨论】:

    标签: javascript node.js sockets udp


    【解决方案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 通过本地网络与非虚拟机 Ubuntu 通信。

    【讨论】:

    • 您的意思是绑定到bin_addr,然后将Membership 添加到multicast_addr?似乎bin_addr 永远不会被使用。我也在尝试这样做。