Net::Ping - 檢查遠端主機的可連線性
use Net::Ping;
my $p = Net::Ping->new();
print "$host is alive.\n" if $p->ping($host);
$p->close();
my $p = Net::Ping->new("icmp");
$p->bind($my_addr); # Specify source interface of pings
foreach my $host (@host_array)
{
print "$host is ";
print "NOT " unless $p->ping($host, 2);
print "reachable.\n";
sleep(1);
}
$p->close();
my $p = Net::Ping->new("icmpv6");
my $ip = "[fd00:dead:beef::4e]";
print "$ip is alive.\n" if $p->ping($ip);
my $p = Net::Ping->new("tcp", 2);
# Try connecting to the www port instead of the echo port
$p->port_number(scalar(getservbyname("http", "tcp")));
while ($stop_time > time())
{
print "$host not reachable ", scalar(localtime()), "\n"
unless $p->ping($host);
sleep(300);
}
undef($p);
# Like tcp protocol, but with many hosts
my $p = Net::Ping->new("syn");
$p->port_number(getservbyname("http", "tcp"));
foreach my $host (@host_array) {
$p->ping($host);
}
while (my ($host, $rtt, $ip) = $p->ack) {
print "HOST: $host [$ip] ACKed in $rtt seconds.\n";
}
# High precision syntax (requires Time::HiRes)
my $p = Net::Ping->new();
$p->hires();
my ($ret, $duration, $ip) = $p->ping($host, 5.5);
printf("$host [ip: $ip] is alive (packet return time: %.2f ms)\n",
1000 * $duration)
if $ret;
$p->close();
# For backward compatibility
print "$host is alive.\n" if pingecho($host);
此模組包含用於測試網路中遠端主機可連線性的方法。首先使用選用參數建立 ping 物件,可以對多個主機進行多次 ping,然後關閉連線。
你可以選擇六種不同的通訊協定來執行 ping。預設的通訊協定為「tcp」。請注意,即使遠端主機是連線狀態,仍可能無法使用其中一種或多種通訊協定進行 ping。例如,www.microsoft.com 通常是連線狀態,但無法使用「icmp」進行 ping。
使用「tcp」通訊協定時,ping() 方法會嘗試建立與遠端主機的回音埠連線。如果成功建立連線,則遠端主機視為可連線。實際上並未回傳任何資料。此通訊協定不需要任何特殊權限,但其負擔比「udp」和「icmp」通訊協定來得高。
指定「udp」通訊協定會導致 ping() 方法傳送 udp 封包至遠端主機的回音埠。如果從遠端主機收到回音封包,且接收到的封包包含與傳送封包相同的資料,則遠端主機即被視為可連線。此通訊協定不需要任何特殊權限。請注意,對於 udp ping,如果主機未執行適當的回音服務,則會回報該主機無法連線。對於類 Unix 系統,請參閱 inetd(8) 以取得更多資訊。
如果指定「icmp」通訊協定,ping() 方法會傳送 icmp 回音訊息至遠端主機,這正是 UNIX ping 程式所執行的動作。如果從遠端主機收到回音訊息,且回音資訊正確,則遠端主機即被視為可連線。指定「icmp」通訊協定需要以 root 身分執行程式,或將程式設定為 root 的 setuid。
如果指定「external」通訊協定,ping() 方法會嘗試使用 Net::Ping::External
模組來 ping 遠端主機。Net::Ping::External
會與系統預設的 ping
程式介接,以執行 ping,通常會產生相對精確的結果。如果系統未安裝 Net::Ping::External
,指定「external」通訊協定將導致錯誤。
如果指定「syn」通訊協定,"ping" 方法只會傳送 TCP SYN 封包至遠端主機,然後立即傳回。如果成功傳送 syn 封包,將傳回 true 值,否則會傳回 false。注意:與其他通訊協定不同,傳回值並不會判斷遠端主機是否存活,因為完整的 TCP 三向交握可能尚未完成。只有在遠端主機於指定逾時時間內收到 TCP ACK 時,才被視為可連線。若要開始等待 ACK 封包,請使用 "ack" 方法,說明如下。使用「syn」通訊協定而非「tcp」通訊協定,可透過同時傳送平行 TCP SYN 封包,來判斷多個目的地是否可連線。在測試每個遠端主機時,它不會造成阻礙。此通訊協定不需要任何特殊權限。
建立一個新的 ping 物件。所有參數都是選用的,而且可以傳遞為雜湊參照。除了前 7 個選項之外,所有選項都必須傳遞為雜湊參照。
proto
指定執行 ping 時要使用的通訊協定。目前的選擇包括「tcp」、「udp」、「icmp」、「icmpv6」、「stream」、「syn」或「external」。預設值為「tcp」。
如果提供以秒為單位的 timeout
,則會在未將逾時傳遞給 ping() 方法(如下)時使用該逾時。逾時必須大於 0,而且如果未指定,預設值為 5 秒。
如果提供資料位元組數目(bytes
),則會在傳送至遠端主機的 ping 封包中包含那麼多個資料位元組。如果通訊協定為「tcp」,則會忽略資料位元組數目。如果通訊協定為「udp」,則資料位元組的最小(而且預設)數目為 1,否則為 0。可以指定的最大資料位元組數目為 65535,但建議維持在 MTU(ICMP 為 1472 位元組)以下。許多小型裝置無法處理片段化的 ICMP 封包。
如果提供 device
,則會在傳送 ping 封包之前使用此裝置繫結來源端點。我相信這目前僅適用於超級使用者權限以及 udp 和 icmp 通訊協定。
如果提供 <tos>,則會將此 ToS 組態至 socket 中。
對於 icmp,可以指定 ttl
以設定傳出封包的 TTL。
IPv4 的有效 family
值
4, v4, ip4, ipv4, AF_INET (constant)
IPv6 的有效 family
值
6, v6, ip6, ipv6, AF_INET6 (constant)
如果未提供 family 參數,host
參數將隱式指定 family。
port
參數僅對 udp、tcp 或串流 ping 有效,且不會執行您認為它會執行的動作。當我們收到「連線拒絕」時,ping 會傳回 true!預設值為回音埠。
bind
參數指定要繫結的 local_addr。透過指定 bind 參數,您不需要 bind 方法。
gateway
參數僅對 IPv6 有效,且需要 IPv6 位址。
retrans
參數為指數遞減率,預設值為 1.2。它與 $def_factor 全域變數相符。
dontfrag
參數設定 IP_DONTFRAG 位元,但請注意,Socket 尚未定義 IP_DONTFRAG,且在許多系統上不可用。然後它會被忽略。在 linux 上,它也會將 IP_MTU_DISCOVER 設定為 IP_PMTUDISC_DO,但我們不需要分段傳送過大封包。您需要手動設定 $data_size。
對遠端主機執行 ping 並等待回應。$host 可以是遠端主機的主機名稱或 IP 號碼。選擇性逾時時間必須大於 0 秒,且預設值為在建立 ping 物件時指定的逾時時間。傳回成功旗標。如果找不到主機名稱或 IP 號碼有問題,傳回的成功旗標將為 undef。否則,如果主機可連線,成功旗標將為 1;如果不可連線,則為 0。在大部分實際用途上,undef 和 0 可以視為相同情況。在陣列內容中,也會傳回經過時間以及主機解析到的 IP 字串形式。如果先前已呼叫 hires(),經過時間值將是 Time::HiRes::time() 函數傳回的浮點數;否則,它會以整數傳回。
允許啟用或停用來源端點驗證。這對於具有多個介面的遠端目的地很有用,其中回應可能不會來自與原始目的地端點相同的端點。這只會影響 udp 和 icmp 協定的 ping。
這在預設情況下已啟用。
設定是否連線行為應強制執行遠端服務可用性以及可達性。通常,如果遠端伺服器回報 ECONNREFUSED,它一定是可達的,因為它回報的狀態封包。啟用此選項後,必須成功建立完整的 TCP 三向交握,才能宣稱它可達。注意:它仍然只會連線和斷線。它不會使用任何協定(例如 HTTP 或 FTP)來確保遠端伺服器在任何方面都是正常的。遠端伺服器 CPU 可能會停止運作,對任何連線的用戶端沒有回應,但如果核心拋出 ACK 封包,它仍被視為存活的。要真正確定伺服器是否正常回應將取決於應用程式,這超出了 Net::Ping 的範圍。對於 udp 協定,啟用此選項要求遠端伺服器使用 udp 回應服務定義的相同 udp 資料。
這會影響「udp」、「tcp」和「syn」協定。
這在預設情況下已停用。
已棄用的方法,但與 service_check() 方法相同。
使用 1 個原因讓此模組使用 Time::HiRes 模組,允許後續呼叫 ping() 回傳毫秒。
目前時間,是否為高解析度。
設定或清除檔案處理中的 O_NONBLOCK 旗標。
使用參數設定選項。不使用則傳回選項值。
通知相應的 IPv6 MTU。
使用參數設定選項。不使用則傳回選項值。
使用參數設定選項。不使用則傳回選項值。
設定 ipv6 可達性 IPV6_REACHCONF 已在 RFC3542 中移除。ping6 -R 支援它。IPV6_REACHCONF 需要 root/admin 權限。
使用參數設定選項。不使用則傳回選項值。
尚未實作。
設定發送 ping 的來源位址。這必須是本機主機上其中一個介面的位址。$local_addr 可以指定為網域名稱或文字 IP 位址,例如「192.168.1.1」。
如果通訊協定設定為「tcp」,則可以多次呼叫此方法,而每次呼叫 ping() 方法(如下)都將使用最新的 $local_addr。如果通訊協定為「icmp」或「udp」,則每個物件最多只能呼叫 bind() 一次,而且(如果呼叫的話)必須在呼叫該物件的 ping() 之前呼叫。
在對 new() 指定 bind
選項時,可以省略 bind() 呼叫。
使用「icmp」通訊協定時,此呼叫允許將訊息類型變更為「echo」或「timestamp」(僅適用於 IPv4,請參閱 RFC 792)。
不使用參數時,它會傳回目前使用的 icmp 通訊協定訊息類型。預設傳回「echo」。
當您使用「串流」協定時,此呼叫會預先開啟 tcp socket。只有當您想要在建立連線時提供不同的逾時,或從第一次 ping 中移除建立連線的負擔時,才需要執行此操作。如果您沒有呼叫 open()
,則會在第一次呼叫 ping()
時自動開啟連線。如果您使用的是串流以外的任何協定,此呼叫只會執行無動作。
在 new() 中指定 host
選項時,可以省略 $host 引數。
在使用「syn」協定時,請使用此方法來判斷遠端主機的可及性。此方法的用意是呼叫次數最多可達呼叫 ping() 的次數。每次呼叫都會傳回透過 TCP ACK 回應的主機(如傳遞給 ping() 的主機)。主機傳回的順序不一定與使用 ping() 方法將其排入 SYN 佇列的順序相同。如果在收到 TCP ACK 之前逾時,或如果遠端主機未在嘗試連接的埠上監聽,則不會建立 TCP 連線,且 ack() 會傳回 undef。在清單內容中,會傳回主機、確認時間、點分 IP 字串和埠號,而不會只傳回主機。如果指定了選用的 $host
引數,傳回值將只與該主機相關。如果您使用的是「syn」以外的任何協定,此呼叫只會執行無動作。
當 "new" 有 host 選項時,將使用此主機。如果沒有 $host
引數,則會掃描所有主機。
主機 $failed_ack_host
未收到有效 ACK 的原因。當 ack($fail_ack_host)
傳回 false 值時,此方法有助於找出原因。
由 "ack" 呼叫的變體,啟用「syn」通訊協定和 $syn_forking
。
使用 icmp 通訊協定的 "ping" 方法。
使用 icmpv6 通訊協定的 "ping" 方法。
使用 stream 通訊協定的 "ping" 方法。
執行 stream ping。如果 tcp 連線尚未開啟,則會開啟。然後會傳送一些資料並等待回覆。它會在結束時保持 stream 開啟。
使用 syn 通訊協定的 "ping" 方法。傳送 TCP SYN 封包至指定的 host。
使用 forking syn 通訊協定的 "ping" 方法。
使用 tcp 通訊協定的 "ping" 方法。
使用 udp 通訊協定的 "ping" 方法。
執行 udp 回應 ping。建構一個訊息,至少包含一個位元組的順序號碼和任何其他資料位元組。傳送訊息並等待訊息傳回。如果我們收到訊息,請確保其所有部分都相符。如果相符,我們就完成了。否則,返回並等待訊息,直到時間用完。傳回我們努力的結果。
與外部通訊協定一起使用的 "ping" 方法。使用 Net::Ping::External 執行外部 ping。
啟動 TCP 連線,用於 tcp ping。
執行 TCP 回應。它將給定的字串寫入 socket,然後再讀回。成功時傳回 1,失敗時傳回 0。
關閉此 ping 物件的網路連線。網路連線也會因「undef $p」而關閉。如果 ping 物件超出範圍(例如 $p 是子常式的區域變數,而你離開了子常式),網路連線會自動關閉。
當呼叫時附帶埠號,用於 ping 的埠號會設定為 $port_number
,而不是使用回應埠。它也會呼叫 $p->service_check(1)
,導致只有在特定埠可存取時,ping 才會傳回成功的回應。此函式傳回 "ping" 將連線的埠值。
一個補償平台特殊性的 select()
包裝器。
inet_ntop()
的平台抽象
對訊息進行檢查和。基本上將所有短字詞相加,並將高階位元摺疊到低階位元中。
傳回 addr、類型和次代碼的清單。
為了提供與先前版本的 Net::Ping 的向後相容性,提供一個具有與先前相同功能的 pingecho()
子程式。pingecho()
使用 tcp 協定。傳回值和參數與 "ping" 方法所述相同。此子程式已過時,可能會在未來的 Net::Ping 版本中移除。
發出廣受歡迎的喚醒區域網路魔法 udp 封包,以喚醒本機裝置。另請參閱 Net::Wake,但此處將 mac 位址設為第一個引數。$host
應該是本機閘道。如果不設定,將廣播。
預設主機:'255.255.255.255' 預設埠:9
perl -MNet::Ping=wakeonlan -e'wakeonlan "e0:69:95:35:68:d2"'
如果您指定 udp 或 icmp 協定,將會減少網路負載(以及程式中的一些效率)。tcp 協定會為每個 ping 產生 2.5 倍以上的流量,高於 udp 或 icmp。如果頻繁 ping 許多主機,您可能希望在每次 ping 之間實作一小段等待時間(例如 25 毫秒或更長),以避免封包淹沒您的網路。
icmp 和 icmpv6 協定要求程式以 root 身分執行,或設定為 root 的 setuid。其他協定不需要特殊權限,但並非所有網路裝置都實作 tcp 或 udp 回音。
本機主機通常會在幾毫秒內回應 ping。但是,在非常壅塞的網路中,可能需要長達 3 秒或更長的時間才能從遠端主機收到回音封包。如果在這些條件下將逾時設定得太低,看起來遠端主機無法連線(這幾乎是事實)。
可達性並不一定表示遠端主機實際上運作超出其回送封包的能力。與 icmp 相比,tcp 稍微能更佳地指出系統的健康狀況,因為它使用更多網路堆疊來回應。
由於缺乏更好的方法,此模組使用其自己的例程來封裝和解封 ICMP 封包。最好撰寫一個獨立的模組,了解所有不同類型的 ICMP 封包。
最新的原始碼樹可透過 git 取得
git clone https://github.com/rurban/Net-Ping.git
cd Net-Ping
tarball 可依下列方式建立
perl Makefile.PL ; make ; make dist
最新的 Net::Ping 發行版包含在 cperl 和 perl5 中。
如需已知問題清單,請瀏覽
https://rt.cpan.org/NoAuth/Bugs.html?Dist=Net-Ping 和 https://github.com/rurban/Net-Ping/issues
如需回報新的錯誤,請瀏覽
https://github.com/rurban/Net-Ping/issues
Current maintainers:
perl11 (for cperl, with IPv6 support and more)
p5p (for perl5)
Previous maintainers:
bbb@cpan.org (Rob Brown)
Steve Peters
External protocol:
colinm@cpan.org (Colin McMillen)
Stream protocol:
bronson@trestle.com (Scott Bronson)
Wake-on-lan:
1999-2003 Clinton Wong
Original pingecho():
karrer@bernina.ethz.ch (Andreas Karrer)
pmarquess@bfsec.bt.co.uk (Paul Marquess)
Original Net::Ping author:
mose@ns.ccsn.edu (Russell Mosemann)
版權所有 (c) 2017-2020,Reini Urban。保留所有權利。
版權所有 (c) 2016,cPanel Inc。保留所有權利。
版權所有 (c) 2012,Steve Peters。保留所有權利。
版權所有 (c) 2002-2003,Rob Brown。保留所有權利。
版權所有 (c) 2001,Colin McMillen。保留所有權利。
本程式為自由軟體;您可以在與 Perl 相同的條款下重新散布或修改它。