Perl套接字如何在Linux下解析主机名?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Perl套接字如何在Linux下解析主机名?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1550字,纯文字阅读大概需要3分钟。
内容图文
我有一个(据我所知)完美的Linux设置(Ubuntu 8.04),其中所有工具(nslookup,curl,wget,firefox等)都能够解析地址.但是,以下代码失败:
$s = new IO::Socket::INET(
PeerAddr => 'stackoverflow.com',
PeerPort => 80,
Proto => 'tcp',
);
die "Error: $!\n" unless $s;
我验证了以下内容:
> Perl能够使用gethostbyname解析地址(即下面的代码可以工作):
my $ret = gethostbyname(‘stackoverflow.com’);
print inet_ntoa($ret);
>原始源代码在Windows下运行
>这是它应该如何工作(即它应该解析主机名),因为LWP试图使用这种行为(实际上我通过尝试调试为什么LWP不能为我工作而偶然发现问题)
>运行脚本不会发出DNS请求(因此它甚至不会尝试解析名称).用Wireshark验证
解决方法:
从快速看,下面的代码来自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()效果更好.
内容总结
以上是互联网集市为您收集整理的Perl套接字如何在Linux下解析主机名?全部内容,希望文章能够帮你解决Perl套接字如何在Linux下解析主机名?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。