summaryrefslogtreecommitdiff
path: root/lib/Net/Ping.pm
diff options
context:
space:
mode:
Diffstat (limited to 'lib/Net/Ping.pm')
-rw-r--r--lib/Net/Ping.pm64
1 files changed, 64 insertions, 0 deletions
diff --git a/lib/Net/Ping.pm b/lib/Net/Ping.pm
new file mode 100644
index 0000000000..2528f55255
--- /dev/null
+++ b/lib/Net/Ping.pm
@@ -0,0 +1,64 @@
+package Net::Ping;
+
+# Authors: karrer@bernina.ethz.ch (Andreas Karrer)
+# pmarquess@bfsec.bt.co.uk (Paul Marquess)
+
+require Exporter;
+
+@ISA = qw(Exporter);
+@EXPORT = qw(ping pingecho);
+
+use Socket;
+use Carp ;
+
+$tcp_proto = (getprotobyname('tcp'))[2];
+$echo_port = (getservbyname('echo', 'tcp'))[2];
+
+sub ping {
+ croak "ping not implemented yet. Use pingecho()";
+}
+
+
+sub pingecho {
+
+ croak "usage: pingecho host [timeout]"
+ unless @_ == 1 || @_ == 2 ;
+
+ local ($host, $timeout) = @_;
+ local (*PINGSOCK);
+ local ($saddr, $ip);
+ local ($ret) ;
+
+ # check if $host is alive by connecting to its echo port, within $timeout
+ # (default 5) seconds. returns 1 if OK, 0 if no answer, 0 if host not found
+
+ $timeout = 5 unless $timeout;
+
+ if ($host =~ /^\s*((\d+\.){3}\d+)\s*$/)
+ { $ip = pack ('C4', split (/\./, $1)) }
+ else
+ { $ip = (gethostbyname($host))[4] }
+
+ return 0 unless $ip; # "no such host"
+
+ $saddr = pack('S n a4 x8', AF_INET, $echo_port, $ip);
+ $SIG{'ALRM'} = sub { die } ;
+ alarm($timeout);
+
+ $ret = eval <<'EOM' ;
+
+ return 0
+ unless socket(PINGSOCK, PF_INET, SOCK_STREAM, $tcp_proto) ;
+
+ return 0
+ unless connect(PINGSOCK, $saddr) ;
+
+ return 1 ;
+EOM
+
+ alarm(0);
+ close(PINGSOCK);
+ $ret == 1 ? 1 : 0 ;
+}
+
+1;