我刚刚在nodejs中创建了这个简单的程序,但我无法将其绑定到我的网卡的ipv6地址。
我在API文档中读到以下内容
localAddress:用于绑定网络连接的本地接口。
var http = require('http');
var options = {
hostname: 'www.whatismyipv6.com',
localAddress: '2a01:xxxx:xxxx:xxxx::2' //a real ipv6 address here
};
var req = http.request(options, function(res) {
res.on('data', function (chunk) {
console.log(chunk.toString());
});
});
req.on('error', function(e) {
console.log('ERROR: ' + e.message);
});
req.end();
但是当我执行程序时,我得到了这个。注意ipv4地址。
<head>
<title>WhatIsMyIPv6? (IPv4: xx.xx.xxx.xxx)</title>
<meta name="bitly-verification" content="984886d337a6"/>
</head>
看起来nodejs忽略了localAddress并直接绑定到ipv4地址。
# node --version
v0.8.0
答案 0 :(得分:1)
可以强制节点使用ipv6进行连接,至少它可以在节点v0.12.7上运行。您的选择将如下所示:
var options = {
hostname: 'www.whatismyipv6.com',
localAddress: '2a01:xxxx:xxxx:xxxx::2', //a real ipv6 address here
family: 6
};
答案 1 :(得分:0)
不幸的是,你对这个以及任何同时发布A和AAAA RR的主机都不走运。
http.js 未向堆栈中传递 addressType (地址系列),因此在调用的底部 lookup() func in dns.js 只发出一般 getaddrinfo()调用并获取第一个返回的结果,即本例中目标主机的IPv4地址的A RR 。
如果您检查 dns.js ,则可以看到 lookup()只是在没有指定系列时从结果中弹出地址[0]:
function onanswer(addresses) {
if (addresses) {
if (family) {
callback(null, addresses[0], family);
} else {
callback(null, addresses[0], addresses[0].indexOf(':') >= 0 ? 6 : 4);
}
} else {
callback(errnoException(process._errno, 'getaddrinfo'));
}
}
正如您所看到的,它确实努力为该结果设置系列;在您的示例中,第一个结果被标识为IPv4系列,并且随着这个渗透,堆栈绑定相应地完成,覆盖了 localAddress 规范。
您可以通过将目标主机更改为ipv6.whatismyipv6.com来查看此信息。奇迹般地,您的localhost的IPv6地址现在已根据需要绑定。