www.farid-hajji.net banner

Farid Hajji

Perl: Einführung, Anwendungen, Referenz (2/e) [Support-Site]

Farid Hajji: Perl - Einführung, Anwendungen, Referenz
2., aktualisierte und erweiterte Auflage
Addison-Wesley Longman, ISBN 3-8273-1535-2

Beispielprogramm

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
FreeBSD Logo