3

nodejs でこの単純なプログラムを作成しましたが、NIC の 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
4

2 に答える 2

0

残念ながら、これと、A RR と AAAA RR の両方が公開されている他のホストでは運が悪いです。

http.jsはaddressType (アドレス ファミリ) をスタックに渡さないため、呼び出しの最後でdns.jsのlookup()関数は一般的なgetaddrinfo()呼び出しを発行し、最初に返された結果を受け取ります。この例では、ターゲット ホストの IPv4 アドレスの A RR。

dns.jsを確認すると、ファミリーが指定されていない場合、 lookup()が結果から address[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 アドレスが希望どおりにバインドされました。

于 2013-09-24T13:44:51.727 に答える