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

标签 perl

据我所知,通过perl查找可ping通的IP有两种方法,分别是

 1. Using system Ping Command.
 2. Using Net::Ping Module.

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

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

不知道哪一个是正确的。任何人请建议我选择正确的方法来查找可 ping 的 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";

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

谢谢, 马德汉

最佳答案

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

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

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

但是,如果您只想要系统所拥有的 ping ,文档指出您可以使用关键字 'external'作为调用系统的“协议(protocol)”ping命令。

关于perl - 系统函数 "ping"和 Perl 中的 Net::Ping 模块之间的区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15360233/

相关文章:

regex - Perl:最快的比赛?

bash - 将多个 CSV 行与大多数空字段合并为每个时间戳的单行

perl - (Windows 10)尝试安装 PPM 和 CPAN 都失败的 Perl 模块?

Perl::Dancer 如何将文件路径作为参数包含在 URI 中

perl - 如何从 Perl hashref 中提取多个值?

java - 从 Java tomcat 执行 Perl 脚本返回 255 退出代码

linux - 如何在 linux 中使用 perl 脚本执行 avconv 命令

regex - 在 Perl 中使用正则表达式列出来自另一个 Perl 脚本的变量

perl - 如何在 Perl 中管理 fork 池?

linux - 选择缺失序列号周围的线条