Helo,

  this is my first try with perl. I've programmed mainly in C-style
languages and lisp, and I know that my code isn't very "perl-like".

So, can somebody enlight me of a better way to right this ?
Thanks for your time,

  Duarte

Problem:
Write a program that receives two arguments: a ip address and a integer
that I call COUNT.
Use external program ping to check for replies, making COUNT tries.
Return 6 numbers: send packets, received packets, lost packets, min,
average, and max roundtrip.

The output of ping is:

(for a successful ping):
[root@linux modules]# ping -w 5 -c 3 10.15.96.2
Warning: no SO_TIMESTAMP support, falling back to SIOCGSTAMP
PING 10.15.96.2 (10.15.96.2) from 10.15.96.1 : 56(84) bytes of data.
64 bytes from 10.15.96.2: icmp_seq=0 ttl=128 time=1.465 msec
64 bytes from 10.15.96.2: icmp_seq=1 ttl=128 time=168 usec
64 bytes from 10.15.96.2: icmp_seq=2 ttl=128 time=154 usec

--- 10.15.96.2 ping statistics ---
3 packets transmitted, 3 packets received, 0% packet loss 
round-trip min/avg/max/mdev = 0.154/0.595/1.465/0.615 ms
[root@linux modules]#


(for a failure):
[root@linux modules]# ping -w 5 -c 3 10.15.96.5
Warning: no SO_TIMESTAMP support, falling back to SIOCGSTAMP
PING 10.15.96.5 (10.15.96.5) from 10.15.96.1 : 56(84) bytes of data.
>From 10.15.96.1: Destination Host Unreachable

--- 10.15.96.5 ping statistics ---
4 packets transmitted, 0 packets received, +1 errors, 100% packet loss
[root@linux modules]#



Now, what I've done....


#!/usr/bin/perl

# used for testing connectivity
# Arguments: IP to check, count
# results: 1 line with send receive lost min med max

print "ICMP Test to @ARGV[0], @ARGV[1] times.\n";


open(line, "ping -w 5 -c @{ARGV[1]} -q @{ARGV[0]}  2>/dev/null |")
                    || die "can't fork: $!";
    while (<line>) {
        $linha=$_;
        if(/transmitted/) 
        {

          ($trans,$t,$t, $received,$t,$t, $lost,$t,$tmp) = split (/ /,
$linha);

        chop($lost);
        chop($tmp);
        if($lost == 0 && $lost ne "0")
        { $lost=$tmp;}
         print "$trans $received $lost ";
        }
        if(/mdev/)
        {
          ($t,$t,$t, $pac) = split (/ /, $linha);
          ($min, $med, $max) = split (/\//, $pac);
          print "$min $med $max\n";
        }
        next ;

    }

    #strangely if the ping fails and I try to close line I get a error
on perl:
    #    [root@linux modules]# ./test_icmp.pl 10.15.96.5 3
    #    ICMP Test to 10.15.96.5, 3 times.
    #    bad ping:  256 at ./test_icmp.pl line 36.
    #    4 0 100 [root@linux modules]#


    if($received==@ARGV[1])
    {
     close line || die "bad ping: $! $?";
     exit;
    }
    print "0 0 0\n";

-- 
Duarte Manuel Cordeiro 

--
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to