2012-06-26 77 views
2

我刚刚在nodejs中创建了这个简单的程序,但我无法将其绑定到我的NIC的ipv6地址。如何将本地ipv6地址绑定到我的node.js程序?

我在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

不幸的是,你在这一个运气不好,并与任何其他主机同时发布A和AAAA RRs。

http.js未通过的地址类型(地址族)在堆栈中向下,所以在通话底部的查找() FUNC在dns.js只是发出一般性getaddrinfo()调用并获取第一个返回的结果,这是本例中目标主机的IPv4地址的A RR。

如果检查dns.js你可以看到,查找()只是弹出地址[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;神奇地,您的本地主机的IPv6地址现在已按照您的要求绑定。

1

可以强制节点使用ipv6进行连接,至少它可以在节点v0.12.7上工作。您的选项将如下所示:

var options = { 
    hostname: 'www.whatismyipv6.com', 
    localAddress: '2a01:xxxx:xxxx:xxxx::2', //a real ipv6 address here 
    family: 6 
};