开发者社区 问答 正文

JS如何在node.js中订阅广播地址(255.255.255.255)

我听不到广播的消息255.255.255.255。该ARTNET协议文档说,ARTNET控制器广播到255.255.255.255端口6454(也可参见这里。

当我尝试255.255.255.255使用node.js的dgram模块进行侦听时,我得到一个“ EINVAL”错误,因为这255.255.255.255是一个无效的地址。

我试着订阅192.255.255.255,192.168.255.255以及192.168.10.255(代替255.255.255.255)。这些都不起作用。在Windows和Ubuntu上测试。

const dgram = require('dgram');

const sock = dgram.createSocket('udp4', (msg, peer) => { console.log(msg, peer); });

sock.bind(6454, () => { sock.addMembership('255.255.255.255'); }); 堆栈跟踪:

dgram.js:581 throw errnoException(err, 'addMembership'); ^

Error: addMembership EINVAL at Socket.addMembership (dgram.js:581:11) at Socket.sock.bind (/home/kyle/temptest/listen3.js:15:8) at Object.onceWrapper (events.js:286:20) at Socket.emit (events.js:198:13) at startListening (dgram.js:128:10) at state.handle.lookup (dgram.js:249:7) at process._tickCallback (internal/process/next_tick.js:63:19) at Function.Module.runMain (internal/modules/cjs/loader.js:834:11) at startup (internal/bootstrap/node.js:283:19) at bootstrapNodeJSCore (internal/bootstrap/node.js:622:3)

展开
收起
被纵养的懒猫 2019-09-29 18:05:49 713 分享 版权
阿里云 AI 助理回答

在您的问题中,您尝试使用Node.js的dgram模块监听ARTNET协议的广播消息,但遇到了无效地址的错误。广播地址255.255.255.255是一个特殊的IP地址,用于在同一局域网内广播消息,但是直接将其作为多播组地址添加是不正确的,因为这个操作在UDP套接字层面并不支持。

对于您的需求,实际上不需要显式地加入到255.255.255.255这个广播地址。当您在UDP套接字上绑定一个端口并设置为监听模式时,该套接字会自动接收来自同一子网内任何地址(包括广播地址)发来的数据包,只要这些数据包的目标端口与您监听的端口匹配。

因此,您应该修改代码如下:

const dgram = require('dgram');

// 创建UDP socket并绑定到6454端口
const sock = dgram.createSocket('udp4');
sock.on('listening', () => {
    const address = sock.address();
    console.log(`Server listening ${address.address}:${address.port}`);
});

sock.on('message', (msg, rinfo) => {
    console.log(`Received ${msg.length} bytes from ${rinfo.address}:${rinfo.port}`);
    // 在这里处理接收到的消息
});

// 绑定到本地所有IPv4接口上的6454端口
sock.bind(6454);

这段代码将创建一个UDP服务器,监听所有IPv4接口上的6454端口。这样,无论广播消息来自哪个IP地址(包括255.255.255.255),只要目标端口是6454,您的程序就能接收到这些消息。无需调用addMembership方法,因为它主要用于多播而非广播。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答