從節點,可用的地址列表:Node.js的 - 無法在UDP6套接字綁定到特定的地址
var os = require('os');
os.networkInterfaces()
打印:
{ lo0:
[ { address: '::1',
netmask: 'ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff',
family: 'IPv6',
mac: '00:00:00:00:00:00',
scopeid: 0,
internal: true },
{ address: '127.0.0.1',
netmask: '255.0.0.0',
family: 'IPv4',
mac: '00:00:00:00:00:00',
internal: true },
{ address: 'fe80::1',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: '00:00:00:00:00:00',
scopeid: 1,
internal: true } ],
en0:
[ { address: 'fe80::2acf:e9ff:fe1f:3939',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: '28:cf:e9:1f:39:39',
scopeid: 4,
internal: false },
{ address: '10.0.0.8',
netmask: '255.255.255.0',
family: 'IPv4',
mac: '28:cf:e9:1f:39:39',
internal: false } ],
awdl0:
[ { address: 'fe80::e46a:6cff:fe68:a76a',
netmask: 'ffff:ffff:ffff:ffff::',
family: 'IPv6',
mac: 'e6:6a:6c:68:a7:6a',
scopeid: 8,
internal: false } ] }
但是,如果我嘗試創建特定udp套接字,我可以綁定udp4而不是udp6套接字。
var dgram = require('dgram');
var udp4 = dgram.createSocket('udp4');
udp4.bind(null, '10.0.0.8');
udp4.address()
打印
{ address: '10.0.0.8', family: 'IPv4', port: 65061 }
但
var udp6 = dgram.createSocket('udp6');
udp6.bind(null, 'fe80::e46a:6cff:fe68:a76a');
拋出:
Error: bind EADDRNOTAVAIL fe80::e46a:6cff:fe68:a76a
at Object.exports._errnoException (util.js:874:11)
at exports._exceptionWithHostPort (util.js:897:20)
at dgram.js:213:18
at doNTCallback3 (node.js:452:9)
at process._tickDomainCallback (node.js:399:17)
同樣的事情發生與地址「FE80 :: 2acf:e9ff:fe1f:3939 」。請注意,我在節點的REPL中逐一運行這些語句,因此在嘗試檢查地址時綁定已完成。
我可以做
udp6.bind()
udp6.address()
它打印
{ address: '::', family: 'IPv6', port: 51897 }
,但並沒有告訴我這解決它綁定到(我以告知其他同行NEED)。
爲什麼我可以綁定到特定的IPv4地址而不是IPv6地址?這似乎不一致。這可能是運行時錯誤嗎? Relevant bug in Node issue tracker.
我需要具有特定地址的udp套接字,這些地址反映了os.networkInterfaces中可用的地址,因爲我是building和ICE agent。
我正在使用Node v4.2.2。