# !/usr/bin/perl use IO::Socket; use POSIX 'strftime'; use Time::HiRes qw(gettimeofday tv_interval); use Getopt::Long; my $USAGE = "Usage: sip_ping.pl [-v] [-t] [-s ] [-p ] "; my $RECV_TIMEOUT = 5; # temps d'attente d'une réponse en secondes my $sock; eval { $sock = IO::Socket::INET->new(Proto => 'udp', LocalPort=>'6655', ReuseAddr=>1) }; if ($@) { print "Socket could not be made $@"; } else { # options my ($verbose, $host, $my_ip, $my_port ,$time); #GetOptions("Verbose|v" => \$verbose, "source-ip|s=s" => \$my_ip, "source- port|p=n"=> \$my_port, "time|t" => \$time) or die "Options invalides:\n\n$USAGE\n"; #$my_ip="127.0.0.1"; #$my_port="5060"; # détermine à qui envoyer un ping $verbose=1; $time=1; my $host = "freevoip.fonosip.com"; my $dst_addr; my $portaddr; eval { $dst_addr = inet_aton($host); }; if ($dst_addr eq "") { print "Host $host not found\n"; } else { my $dst_ip = inet_ntoa($dst_addr); eval { $portaddr = sockaddr_in(5060, $dst_addr); }; if ($@) { print "No connection could be made on port 5060 to $host\n"; } else { # détermine qui nous sommes $my_ip = "127.0.0.1" unless defined($my_ip); $my_port = "6655" unless defined($my_port); # Numéro appelant long de 32 caractères hexadécimaux aléatoires my $callid = ""; $callid .= ('0'..'9', "a".."f")[int(rand(16))] for 1 .. 32; # date du jour my $date = strftime('%a, %e %B %Y %I:%M:%S %Z',localtime()); # id de branche - voir la rfc3261 pour plus d'infos, avec # utilisation de time() pour l'unicité #Contact: my $branch="z9hG4bK" . time(); my $packet = qq( REGISTER sip:$my_ip SIP/2.0 Via: SIP/2.0/UDP $my_ip:$my_port;branch=$branch From: To: Contact: Call-ID: $callid\@$my_ip CSeq: 0 REGISTER max-forwards: 10 expires: 60 User-Agent: ServersCheck Monitoring Date: $date Allow: ACK, CANCEL Content-Length: 0 ); # envoie le paquet print "Envoi: \n\n$packet\n" if $verbose; eval { send($sock, $packet, 0, $portaddr) == length($packet) }; if ($@) { print "Could not send data to $host\n"; } else { my $send_time = [gettimeofday()]; # démarre le chronomètre my $elapsed; $RECV_TIMEOUT=5; # obtient la réponse eval { local $SIG{ALRM} = sub { die "temporisation de l'alarme" }; alarm $RECV_TIMEOUT; $portaddr = recv($sock, $packet, 1500, 0) or die "Réception impossible: $!"; alarm 0; 1; } or die($@); # affiche la sortie $elapsed = tv_interval($send_time); # arrête le chrono alarm 0; if ($verbose) { my @data=("time: xx\%0.2fxx, answer:\n", $elapsed*1000, $packet); foreach (@data) { print "data: $_\n"; } } elsif ($time) { printf("%0.2f\n", $elapsed*1000); } else { print("$host est en fonctionnement\n"); } } } } }