Node.js-Can';t将udp6套接字绑定到特定地址

Node.js-Can';t将udp6套接字绑定到特定地址,node.js,sockets,udp,network-interface,stun,Node.js,Sockets,Udp,Network Interface,Stun,在节点中,此可用地址列表: 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: tr

在节点中,此可用地址列表:

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 }
但是

抛出:

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中逐个运行这些语句,所以在我尝试检查地址时,bind已经完成

我能行

udp6.bind()
udp6.address()
哪张照片

{ address: '::', family: 'IPv6', port: 51897 }
但这并没有告诉我它绑定到哪个地址(我需要它来通知其他同龄人)

为什么我可以绑定到特定的IPv4地址而不是IPv6地址?这似乎不一致。这可能是运行时中的错误吗

我需要具有udp套接字,这些套接字具有特定的地址,以反映我作为一名用户时os.networkInterfaces提供的内容


我正在使用Node v4.2.2。

好的,看来我需要一个背景

要点是,对于IPv4,您通常使用类似DHCP的协议来获得本地IP地址。如果您不这样做,您可以选择一个,并希望您不会与网络上的其他主机发生冲突。这样的地址称为“链路本地地址”。这些地址在IPv4中是可选的,现在在IPv6中是必需的。链路本地地址始终具有IPv6地址的前缀fe80::prefix

在Node.js中,您可以监听链接本地地址,但必须在地址字符串后面加上接口名称,例如:

udp6.bind(null, 'fe80::e46a:6cff:fe68:a76a%en0');
可以通过运行ifconfig找到该字符串

然后,如果其他对等方在同一网络上,它们可以与您联系,但它们也必须指定同一网络上网络设备的接口。前

nc6 -u fe80::2acf:e9ff:fe1f:3939%wlp3s0 65022
其中wlp3s0是朋友的无线NIC的接口

如果他们插入以太网并连接到同一个网络,他们就可以通过以太网接口进行发送,但除非它连接到同一个本地网络

另外,我发布的IP地址显示我的家庭路由器没有分配IPv6地址。在工作中,我得到了一个IPv6地址,所以我可以监听一个非fe80前缀的地址——没问题。在工作中,os.networkInterfaces()看起来更像:

  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.252.28.131',
       netmask: '255.255.248.0',
       family: 'IPv4',
       mac: '28:cf:e9:1f:39:39',
       internal: false },
     { address: '2620:101:80fc:224:2acf:e9ff:fe1f:3939',
       netmask: 'ffff:ffff:ffff:ffff::',
       family: 'IPv6',
       mac: '28:cf:e9:1f:39:39',
       scopeid: 0,
       internal: false },
     { address: '2620:101:80fc:224:4d78:1087:39a2:65d7',
       netmask: 'ffff:ffff:ffff:ffff::',
       family: 'IPv6',
       mac: '28:cf:e9:1f:39:39',
       scopeid: 0,
       internal: false } ],
所以我可以成功地绑定到任何2620:前缀地址

最后,对于我的ICE代理来说,声明“不能收集与IPv6链路本地地址对应的主机候选。”

  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.252.28.131',
       netmask: '255.255.248.0',
       family: 'IPv4',
       mac: '28:cf:e9:1f:39:39',
       internal: false },
     { address: '2620:101:80fc:224:2acf:e9ff:fe1f:3939',
       netmask: 'ffff:ffff:ffff:ffff::',
       family: 'IPv6',
       mac: '28:cf:e9:1f:39:39',
       scopeid: 0,
       internal: false },
     { address: '2620:101:80fc:224:4d78:1087:39a2:65d7',
       netmask: 'ffff:ffff:ffff:ffff::',
       family: 'IPv6',
       mac: '28:cf:e9:1f:39:39',
       scopeid: 0,
       internal: false } ],