2012-06-26 122 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 
};