perl中系统函数"ping"和Net :: Ping模块之间的区别?

Mad*_*han 2 perl

据我所知,有两种方法可以通过perl找到pingable ip,它们是

 1. Using system Ping Command.
 2. Using Net::Ping Module.
Run Code Online (Sandbox Code Playgroud)

我尝试通过上述两种技术调用IP的可ping状态.

我在这些方法中遇到问题,即系统ping命令对于一个IP返回true.但是,Net :: Ping模块对同一IP返回false.

我不知道哪一个是正确的.任何人请建议我更喜欢正确的方法来找到一个pingable IP.我在下面编写了示例代码片段:

#!/usr/bin/perl
use strict;
use Net::Ping;

my $ip_address = $ARGV[0];
chomp($ip_address);

#Using Net::Ping Module

my $p = Net::Ping->new();


if ( $p->ping($ip_address) ) {
    print "Step - 1: Success!\n";
}
else {
    print "Step - 1: Fail!\n";
}


#Using System Command

$retval=system("ping -c 2 $ip_address");

if ($retval==0) {
    print "Step - 2: Success!\n";
} else {
    print "Step - 2: Fail!\n";
}

print "\n\n\ Step2: $retval\n\n";
Run Code Online (Sandbox Code Playgroud)

对于某些IP地址,系统命令返回成功,Net :: Ping返回失败.这两种方法有什么区别吗?

谢谢,Madhan

Axe*_*man 5

一个区别是大多数ping使用ICMP数据包的低级实现,而Net::Ping注意TCP是默认值.它还默认发送到可能在特定机器上被阻塞的回声端口(7).如果要发送ICMP数据包,则必须将ICMP指定为构造函数中的第一个参数.

由于您使用的是默认值,我会说这些是主要区别.此外,ICMP没有"端口",而TCP显然.

我喜欢Net::Ping使用TCP 的解释.Net::Ping - 对于它使用的服务器 - 让您更好地了解哪些服务器已启动并响应,而不是仅连接到网络并可以弹回ICMP数据包.

但是,如果您只想要系统中的内容ping,doco指出您可以使用关键字'external'作为"协议"来调用系统ping命令.