2

私が知っているように、perlを介してping可能なIPを見つけるには2つの方法があります。

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

上記の2つの方法で、IPのping可能な状態を呼び出そうとしました。

これらのメソッドで問題が発生しています。つまり、システムのpingコマンドが1つの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は失敗を返します。これら2つの方法に違いはありますか?

ありがとう、マダン

4

1 に答える 1

5

1つの違いは、ほとんどの低レベルの実装でpingはICMPパケットを使用するのに対しNet::Ping、TCPがデフォルトであることに注意してください。また、デフォルトでは、特定のマシンでブロックされている可能性のあるエコーポート(7)に送信します。ICMPパケットを送信する場合は、コンストラクターの最初の引数としてICMPを指定する必要があります。

デフォルトを使用しているので、これらが主な違いだと思います。また、ICMPには「ポート」がありませんが、TCPには明らかにあります。

Net::PingでもTCPを使ったの説明は好きです。Net::Ping-連携するサーバーの場合-ネットワークに接続されているだけでICMPパケットをバウンスできるのではなく、どのサーバーが稼働していて応答性が高いかをより正確に把握できます。

ただし、システムで使用しているものだけが必要な場合は、キーワードを「プロトコル」として使用してシステムコマンドを呼び出すpingことができるとドコは指摘しています。'external'ping

于 2013-03-12T12:09:53.343 に答える