题
下面的代码...
my $user_agent = LWP::UserAgent->new;
my $request = HTTP::Request->new(GET => $url);
my $response = $user_agent->request($request);
if ($response->is_success) {
print "OK\n";
} else {
die($response->status_line);
}
..将会失败 ..
500 Can't connect to <hostname> (Bad hostname '<hostname>')
..如果 $url 中的主机名是仅 IPv6 地址(即:存在一个 AAAA
有记录,但是没有 A
记录)。
我的问题是:
- 如何在 LWP 中启用 IPv6 支持?
- 如何配置 LWP 的“prefer-IPv4-over-IPv6”设置(
A
与AAAA
) / “首选 IPv6 而非 IPv4”(AAAA
与A
)?
解决方案
看起来你只需要使用 网络::INET6Glue::INET_is_INET6. 。引用它的例子:
use Net::INET6Glue::INET_is_INET6;
use LWP::Simple;
print get( 'http://[::1]:80' );
print get( 'http://ipv6.google.com' );
其他提示
我相信您必须更改模块才能使用 IPV6 网络模块。默认情况下它没有启用此功能: http://eintr.blogspot.com/2009/03/bad-state-of-ipv6-in-perl.html. 。我不相信有像“prefer-ipv6”这么简单的东西
Debian Wheezy (perl 5.14)
工作不错:
use LWP::Simple;
print get( 'http://ip6-localhost:80' );
不工作 (1)
use LWP::Simple;
print get( 'http://[::1]:80' );
不工作 (2) [返回: 主机名错误]
use LWP::Simple;
$ua = new LWP::UserAgent();
my $req = new HTTP::Request("GET", "http://[::1]/");
my $res = $ua->request($req);
不工作 (3) [返回: 连接被拒绝]
use Net::INET6Glue::INET_is_INET6;
use LWP::Simple;
$ua = new LWP::UserAgent();
my $req = new HTTP::Request("GET", "http://[::1]/");
my $res = $ua->request($req);
Soo,如果您在http请求中不需要IPv6地址,那就没问题了。:(
不隶属于 StackOverflow