Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2
udp-client.pl
#!/usr/local/bin/perl -w
# udp-client.pl -- UDP-Client fragt Zeit diverser Hosts ab.
use Socket;
use IO::Socket; # Standardmodul
# Wir erzeugen einen "unconnected" UDP-Socket:
$sock = new IO::Socket::INET(Proto => 'udp')
or die "can't create UDP Socket: $!\n";
# Wir wollen allen Hosts auf @ARGV ein Anfragedatagramm senden.
# Dazu merken wir uns die Zieladresse im Binaerformat in %remote.
foreach my $hostname (@ARGV) {
my $port = getservbyname('time', 'udp');
my $ipaddr = gethostbyname($hostname);
my $remaddr = sockaddr_in($port, $ipaddr);
$remote{$hostname} = $remaddr;
}
# Nun senden wir jedem dieser Hosts ein (leeres) Datagramm.
# Das loest bei dem time/udp-Server eine Antwort aus.
foreach my $hostname (sort keys %remote) {
die "can't send to $hostname\n"
unless defined $sock->send("", 0, $remote{$hostname});
}
# Nun lesen wir genau so viele Datagramme ein, wie wir gesendet haben.
# Hinweis: Wenn einige Hosts nicht antworten oder ihre Antworten
# verlorengehen, dann bleiben wir an nicht beantworteten
# recv()s haengen. In diesem Fall mit CTRL-C abbrechen!
foreach my $nreply ( 1 .. scalar(keys(%remote)) ) {
my ($src, $answer);
$src = $sock->recv($answer, 4, 0) || die "can't recv(): $!\n";
my $remotehost = gethostbyaddr((sockaddr_in($src))[1], AF_INET);
proceed_result($nreply, $remotehost, $answer);
}
# Hier werten wir das Antwortpaket aus.
# Die Antwort ist ein 4 Byte-Wert in Network-Byte-Order,
# der die Zeit in Sekunden seit dem 1.1.1900 (nicht 1970!) angibt.
use constant SECS_OF_70_YEARS => 2208988800;
sub proceed_result {
my ($replynr, $remotename, $remotetime) = @_;
$rt = unpack("N", $remotetime) - SECS_OF_70_YEARS;
print "($replynr) $remotename: ", scalar(localtime($rt)), "\n";
}
[Prev] [Up] [Relevant Chapter] [Next]
[Alte Quelle]
| Last modified: $Date: 2006/05/18 12:56:10 $ FH. Search :: Sitemap :: Disclaimer :: Copyright :: Privacy |
|