Perl套接字如何在Linux下parsing主机名?

我有一个(从我可以告诉)完美的工作Linux的设置(Ubuntu 8.04)所有的工具(nslookup,curl,wget,火狐等)能够解决地址。 但是,以下代码失败:

$s = new IO::Socket::INET( PeerAddr => 'stackoverflow.com', PeerPort => 80, Proto => 'tcp', ); die "Error: $!\n" unless $s; 

我validation了以下几件事情:

从快速看,从IO :: Socket :: INET的以下代码

 sub _get_addr { my($sock,$addr_str, $multi) = @_; my @addr; if ($multi && $addr_str !~ /^\d+(?:\.\d+){3}$/) { (undef, undef, undef, undef, @addr) = gethostbyname($addr_str); } else { my $h = inet_aton($addr_str); push(@addr, $h) if defined $h; } @addr; } 

建议(如果你看这个代码的调用者)添加MultiHomed => 1,你的代码。

没有这个解决方法,上面的代码似乎尝试使用Socket.pm中的inet_aton()调用inet_aton("hostname.com") 。 这在Win32和Unix中都适用,所以我想这就是破解的地方。

有关inet_aton的源代码,请参阅Socket.xs:

 void inet_aton(host) char * host CODE: { struct in_addr ip_address; struct hostent * phe; if (phe = gethostbyname(host)) { Copy( phe->h_addr, &ip_address, phe->h_length, char ); } else { ip_address.s_addr = inet_addr(host); } ST(0) = sv_newmortal(); if(ip_address.s_addr != INADDR_NONE) { sv_setpvn( ST(0), (char *)&ip_address, sizeof ip_address ); } } 

看来,Perl gethostbyname()比你的C gethostbyname()更好。

你能否告诉我们你的代码是如何失败的? 你有错误检查在那里的代码,但你没有报告错误是什么!

我刚刚尝试了原始代码(在我的Mac OS X机器上增加了“使用IO :: Socket :: INET”,并且工作正常。

我怀疑多宿主选项是一个不必要的黑客攻击,而其他一些问题是你的问题的根源。

确保你有这个说法

 use IO::Socket::INET; 

在你的源代码的开始。 如果你不这样做,你可能会收到错误信息:

无法通过包“IO :: Socket :: INET”找到对象方法“new”

除此之外,您可以使用Net :: DNS :: Resoler验证DNS是否正在工作,请参阅此处的更多信息。

 use Net::DNS; my $res = Net::DNS::Resolver->new; # Perform a lookup, using the searchlist if appropriate. my $answer = $res->search('example.com');