NodeJS数据报 – 接收IPv6多播

我试图通过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); 套接字绑定成功,但没有收到数据报。

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

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

我也尝试将套接字绑定到特定的接口:

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

这也给我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) 

如果你想绑定到本地链接( fe80:地址,你必须指定你想要的链接。 不幸的是,我还没有find一个方法来做NodeJS。 如果绑定到全局IPv6地址,它将起作用。

对于多播支持,您似乎没有运气… NodeJS似乎只支持IPv4多播。 对addMembership的调用是作为对uv_udp_set_membership的调用来实现的,该调用包含仅包含IPv4的代码。 它使用IP_ADD_MEMBERSHIPparsingIP地址,它使用IP_ADD_MEMBERSHIP选项调用setsockopt ,而IPv6需要IPV6_ADD_MEMBERSHIP等。

NodeJS似乎有点落后于他们的IPv6实施:(

如果你有兴趣,你可以在这里看到源代码: https : //github.com/joyent/node/blob/master/deps/uv/src/unix/udp.c