gpt4 book ai didi

javascript - NodeJS 数据报 - 接收 IPv6 多播

转载 作者:搜寻专家 更新时间:2023-10-31 22:45:57 26 4
gpt4 key购买 nike

我正在尝试在 node.js 中通过 IPv6 接收多播数据报。我在通过 IPv4 (udp4) 以完全相同的方式执行此操作时没有遇到任何问题,但尝试对 udp6 执行相同操作时,在 socket.addMembership 调用时出现 EINVAL 错误。这是我的代码:

var dgram = require('dgram');
var server = dgram.createSocket('udp6');

var PORT = 12345;
var MULTICAST_ADDRESS = 'ff7e:230::1234';

server.on('message', function (message, remote) {
console.log('Message from: ' + remote.address + ':' + remote.port +' - ' + message);
});

server.on('listening', function () {
var address = server.address();
console.log('UDP listening on ' + address.address + ":" + address.port);
server.addMembership(MULTICAST_ADDRESS);
});

server.bind(PORT);

这导致:

    Error: addMembership EINVAL
at new errnoException (dgram.js:454:11)
at Socket.addMembership (dgram.js:396:11)
at Socket.<anonymous> (/media/sf_projects/ipv6_multicast/server.js:57:10)
at Socket.EventEmitter.emit (events.js:92:17)
at startListening (dgram.js:141:10)
at dgram.js:213:7
at dns.js:72:18
at process._tickCallback (node.js:415:13)
at Function.Module.runMain (module.js:499:11)
at startup (node.js:119:16)

当我注释掉 server.addMembership(MULTICAST_ADDRESS); 时,套接字成功绑定(bind),但未收到任何数据报。

我试图用我的 IPv6 作为第二个参数调用 addMembership,但这也给出了 EINVAL。

server.addMembership(MULTICAST_ADDRESS,  'fe80::a00:27ff:fed1:cac9');

我还尝试将套接字绑定(bind)到特定接口(interface):

server.bind(PORT, 'fe80::a00:27ff:fed1:cac9');

a 这也给了我绑定(bind)方法上的 EINVAL。

这是我的 ifconfig 的输出:

    eth0      Link encap:Ethernet  HWaddr 08:00:27:d1:ca:c9  
inet addr:10.0.2.15 Bcast:10.0.2.255 Mask:255.255.255.0
inet6 addr: fe80::a00:27ff:fed1:cac9/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:8996 errors:0 dropped:0 overruns:0 frame:0
TX packets:6081 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:8389966 (8.3 MB) TX bytes:510795 (510.7 KB)

lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:356 errors:0 dropped:0 overruns:0 frame:0
TX packets:356 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:33534 (33.5 KB) TX bytes:33534 (33.5 KB)

最佳答案

如果您想绑定(bind)到本地链接 (fe80:) 地址,您必须指定您想要的链接。不幸的是,我还没有找到一种方法来为 NodeJS 做到这一点。如果您绑定(bind)到全局 IPv6 地址,它将起作用。

对于多播支持,您似乎不太走运……NodeJS 似乎只支持 IPv4 多播。对 addMembership 的调用被实现为对 uv_udp_set_membership 的调用,其中包含仅 IPv4 代码。它使用 inet_addr 解析 IP 地址,使用 IP_ADD_MEMBERSHIP 选项调用 setsockopt 而 IPv6 需要 IPV6_ADD_MEMBERSHIP 等等。

NodeJS 似乎在他们的 IPv6 实现上有点落后:(

如果您有兴趣,可以在此处查看源代码:https://github.com/joyent/node/blob/master/deps/uv/src/unix/udp.c

关于javascript - NodeJS 数据报 - 接收 IPv6 多播,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21183655/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com