perl的Net::Ping不能运行是怎么回事呢?!(结帖)

perl的Net::Ping不能运行是怎么回事呢?!(结帖)



[Copy to clipboard] [ - ]
CODE:
use Net::Ping;

if( pingecho("www.baidu.com", 5) ){
        print "baidu is on the network.";
}else{
        print "baidu is unradchable.";

程序是这样,为什么输出却是baidu is unradchable?

我在shell下直接ping www.baidu.com 是可以的,perl还需要加载什么别的吗?

perldoc Net::Ping


QUOTE:
原帖由 flw 于 2008-1-28 14:33 发表
perldoc Net:ing

我已经看了文档了,但是没看出我的程序哪里不对啊!
perl -MSocket -e 'print gethostbyname("www.baidu.com");'


QUOTE:
原帖由 FinalBSD 于 2008-1-28 15:03 发表
perl -MSocket -e 'print gethostbyname("www.baidu.com");'

[root@cache251-217 perl]# perl -MSocket -e 'print gethostbyname("www.baidu.com");'
www.a.shifen.comwww.baidu.com24ܵ%7ܵ

这说明运行成功了吗?返回的输出我这里看到的是乱码。

还有我想知道我那个脚本输出不正确的原因,能否告知一下?
perldoc中说..
因为pingecho已经不用了,未来版本会不用..请改用ping()

另外..你用domain Name..请注意DNS server的设定....
先在server上..用nslookup www.baidu.com看看有没有IP回传...

[Copy to clipboard] [ - ]
CODE:
#!/usr/bin/perl
use Net::Ping;
$p = Net::Ping->new();
if($p->ping("10.1.1.1")){
  print "YYY\n";
}



QUOTE:
原帖由 apile 于 2008-1-28 15:45 发表
perldoc中说..
因为pingecho已经不用了,未来版本会不用..请改用ping()

另外..你用domain Name..请注意DNS server的设定....
先在server上..用nslookup www.baidu.com看看有没有IP回传...


#!/usr/bin/ ...

ping我试过,会报错的。

[Copy to clipboard] [ - ]
CODE:
use Net::Ping;
if(pingecho("10.0.251.217")){
        print "yes";
}else{
        print "No";=============>这段会输出yes

use Net::Ping;
if(pingecho("www.yahoo.com")){
        print "yes";
}else{
        print "No";=============>这段会输出No

[root@cache251-217 perl]# nslookup [url]www.yahoo.com[/url]
Server:         60.28.250.46
Address:        60.28.250.46#53

Non-authoritative answer:
[url]www.yahoo.com[/url]   canonical name = [url]www.yahoo-ht3.akadns.net.[/url]
Name:   [url]www.yahoo-ht3.akadns.net[/url]
Address: 87.248.113.14

[root@cache251-217 perl]# ping -c 2 [url]www.yahoo.com[/url]
PING [url]www.yahoo-ht3.akadns.net[/url] (87.248.113.14) 56(84) bytes of data.
64 bytes from f1.us.[url]www.vip.ird.yahoo.com[/url] (87.248.113.14): icmp_seq=0 ttl=52 time=360 ms
64 bytes from f1.us.[url]www.vip.ird.yahoo.com[/url] (87.248.113.14): icmp_seq=1 ttl=52 time=360 ms

知道为什麽了..pingecho不能用domain name..你必须要用
gethostbyname将domain name转成ip address...
刚刚试了一下是可行的..

[Copy to clipboard] [ - ]
CODE:
my ($name,$aliases,$addrtype,$length,@addrs) = gethostbyname("www.yahoo.com");
print length(@addrs)."\n";
for(@addrs){
  my @addr = unpack('C4',$_);
  print join(".",@addr)."\n";
}

apile 又错了,其实和 DNS 无关,关键是 Net::Ping 缺省是 tcp 不是 icmp……这个比较汗。
需要在 new 时指定 icmp 才能等同于 ping 命令的效果……


QUOTE:
原帖由 flw 于 2008-1-28 17:11 发表
apile 又错了,其实和 DNS 无关,关键是 Net:ing 缺省是 tcp 不是 icmp……这个比较汗。
需要在 new 时指定 icmp 才能等同于 ping 命令的效果……

的确..下次我会记得去看source code....建议楼主还是别用Net:ing吧...如果要指定icmp需要root的权限...
还需要安装其他东西才能用...

建议用..Net:ing::External 我看过他的source..他会根据平台去使用ping command...

如果不想安装..最简单可以用@rt = `ping xxx`;
分析一下就行了...找到loss rate 不等於 100%, 或success rate不等於 0%....
真的不困难..

[Copy to clipboard] [ - ]
CODE:
use Net::Ping::External qw(ping);

# Ping a single host

  my $alive = ping(host => "10.1.1.1");

  print "10.1.1.1 is online\n" if $alive;