|
Netzwerk-Funktionen in PerlAn dieser Stelle werden kurz die wichtigsten Netzwerk-Module, -Funktionenund -Methoden vorgestellt. Die folgende Auflistung erhebt aber keinen Anspruch auf Vollständigkeit, sondern es werden nur die notwendigsten aufgeführt.Einige Perl-Funktionen verhalten sich anders als ihr äquivalen in C, obwohl siedieselben Namen tragen. inet_aton ist nur ein Beispiel dafür. Ein anderes Beispielist accept(2), die in C einen Filedeskriptoroder -1 liefert, während in Perl eine spezielle Syntax für das neue Filehandle benutzt wird, und der Rückgabewert Information über denKommunikationspartner enthält oder undef ist. (DieseInformation wiederum kann man in C mit getpeername(2)erhalten.) sockaddr_in ist in C eine Struktur, in Perl eineHilfsfunktion, die sowohl benutzt werden kann, um Daten aus dieserStruktur zu extrahieren, als auch um Daten in eine solche Struktur zuverfrachten. IP-AdressenViele Netzwerkfunktionen brauchen eine IP-Adresse als "gepackten Binärstring".Mit den Funktionen pack() und unpack() läßt sichdie Konvertierung durchf¨hren. Das Packen geschieht durch:($a,$b,$c,$d) = split(/\./, '192.168.34.3');$packed_ip = pack('C4',$a,$b,$c,$d); Das entpacken analog durch:($a,$b,$c,$d) = unpack('C4',$packed_ip);
$dotted_quad = join ('.', $a,$b,$c,$d);
Das Packen und Entpacken muß aber nicht von Hand erfolgen, denn es gibt
passende Standardfunktionen dafür:
- $packed_ip = inet_aton($dotted_quad)
Packen einer Adresse der Form 'a.b.c.d' in ein Binärformat wie es von
sockaddr_in() gebraucht wird.
- $dotted_quad = inet_ntoa($packed_ip)
Enpacken einer binär gespeicherten Adresse in das "lesbare" Format.
- $socket_addr = sockaddr_in($port,$address)
($port,$address) = sockaddr_in($socket_addr)
Im skalaren Kontext (obere Zeile) wird eine Portnummer und eine binäre Adresse
in einem Format geliefert, wie es die Methode socket benötigt.
Im Listenkontext (untere Zeile) erfolgt die Konvertierung in umgekehrter Richtung.
Wem das nicht gefällt, kann stattdessen
$socket_addr = pack_sockaddr_in($port,$address)
oder ($port,$address) = unpack_sockaddr_in($socket_addr) verwenden.
gethostbyaddr - Eintrag mit bestimmter IP ermitteln
Ermittelt den Hostnamen zu einer bestimmten IP-Adresse und erwartet als Parameter:
- die gewünschte IP-Adresse numerisch in binärer Schreibweise.
- den Adresstyp der IP-Adresse (numerisch).
Gibt den zugehörigen Hostnamen zurück. Wenn die angegebene IP-Adresse
nicht gefunden wurde, wird undef zurückgegeben.
Im Listenkontext erhält man Name, Aliase, Addresstype, Länge und die
Adresse. Beispiel:
my $addr = inet_aton("127.0.0.1");
my $Wert = gethostbyaddr($addr, AF_INET);
print "$Wert\n";
oder auch:
my $addr = inet_aton("127.0.0.1");
($name,$aliases,$atype,$len,$addrs) = gethostbyaddr($addr, AF_INET);
print "Name: $name\n";
print "Aliases: $aliases\n";
print "Adresse: ".join (".",unpack("C4", $addrs)), "\n";
gethostbyname - Eintrag mit bestimmtem Hostnamen ermitteln
Ermittelt die IP-Adresse zu einem bestimmten Hostnamen und erwartet als Parameter
den gewünschten Hostnamen.
Gibt die zugehörige IP-Adresse binär numerisch zurück.
Im Listenkontext erhält man Name, Aliase, Addresstype, Länge und die
Adresse.
my $addr = gethostbyname("localhost");
my $Wert = inet_ntoa($addr);
oder auch:
my ($name,$aliases,$atype,$len,$addrs) = gethostbyname("menetekel");
print "Name: $name\n";
print "Aliases: $aliases\n";
print "Adresse: ".join (".",unpack("C4", $addrs)), "\n";
getnetbyaddr - Eintrag mit bestimmter IP ermitteln
Ermittelt aus der Datei /etc/networks den Netzwerknamen zu einer
bestimmten IP-Adresse und erwartet als Parameter:
- die gewünschte IP-Adresse numerisch in binärer Schreibweise.
- den Adresstyp der IP-Adresse (numerisch).
Gibt den zugehörigen Netzwerknamen zurück. Wenn die angegebene
IP-Adresse nicht gefunden wurde, wird undef zurückgegeben.
my $addr = inet_aton("127.0.0.0");
my $Wert = getnetbyaddr($addr, AF_INET);
getnetbyname - Eintrag mit bestimmtem Netzwerknamen ermitteln
Ermittelt aus der Datei /etc/networks die IP-Adresse zu einem
bestimmten Netzwerknamen und erwartet als Parameter den gewünschten
Netzwerknamen.
Gibt die zugehörige IP-Adresse binär numerisch zurück.
my $addr = getnetbyname("loopback");
my $Wert = inet_ntoa($addr);
getprotobyname - Eintrag mit bestimmtem Protokollnamen ermitteln
Ermittelt aus der Datei /etc/protocols die Protokollnummer zu einem
bestimmten Protokollnamen. Erwartet als Parameter den gewünschten Protokollnamen.
Gibt die zugehörige Protokollnummer zurück. Wenn der übergebene
Protokollname nicht gefunden wurde, wird undef zurückgegeben.
Im Listenkontext erhält man Name, Aliase und Protokollnummer:
my $number = getprotobyname("tcp");
print "$number\n";
my ($name,$aliases,$number) = getprotobyname("tcp");
print "Name: $name\n";
print "Aliases: $aliases\n";
print "$number\n";
getprotobynumber - Eintrag mit bestimmter Protokollnummer ermitteln
Ermittelt aus der Datei /etc/protocols den Protokollnamen zu einer
bestimmten Protokollnummer. Erwartet als Parameter die gewünschte Protokollnummer.
Gibt den zugehörigen Protokollnamen zurück. Wenn die übergebene
Protokollnummer nicht gefunden wurde, wird undef zurückgegeben.
Im Listenkontext erhält man Name, Aliase und Protokollnummer:
my $number = getprotobynumber(17);
print "$number\n";
my ($name,$aliases,$number) = getprotobynumber(17);
print "Name: $name\n";
print "Aliases: $aliases\n";
print "$number\n";
getpwnam - Eintrag mit bestimmtem Benutzernamen ermitteln
Ermittelt zu einem bestimmten Benutzernamen den Eintrag aus der Datei /etc/passwd
den zugehörigen Eintrag. Im skalaren Kontext wird die Benutzernummer (UID) ermittelt,
im Listenkontext eine Liste mit bis zu neun Elementen.
Erwartet als Parameter den gewünschten Benutzernamen.
Gibt im skalaren Kontext die zugehörige Benutzernummer (UID) und im Listenkontext
eine Liste mit allen Daten des Eintrags zurück. Wenn der Benutzername nicht
gefunden wurden, wird undef zurückgegeben.
print "\nUser-ID: ";
chop ($login = <STDIN>);
(@pw_info) = (getpwnam("$login"));
print "\nUserinformationen fuer login: $login\n\n";
print "Login: $pw_info[0]\n";
print "Pw (encoded): $pw_info[1]\n";
print "UserID: $pw_info[2]\n";
print "GroupID: $pw_info[3]\n";
print "Kommentar: $pw_info[6]\n";
print "HomeDir: $pw_info[7]\n";
print "Shell: $pw_info[8]\n";
print "\n\n";
getpwuid - Eintrag mit bestimmter Benutzernummer ermitteln
Ermittelt zu einer bestimmten Benutzernummer (UID) den Eintrag aus der Datei
/etc/passwd den zugehörigen Eintrag. Im skalaren Kontext wird
der Benutzername ermittelt, im Listenkontext eine Liste mit bis zu neun Elementen.
Erwartet als Parameter die gewünschte Benutzernummer (UID).
Gibt im skalaren Kontext den zugehörigen Benutzernamen und im Listenkontext
eine Liste mit allen Daten des Eintrags zurück. Wenn die Benutzernummer
nicht gefunden wurden, wird undef zurückgegeben.
print "\nUser-ID: ";
chop ($login = <STDIN>);
(@pw_info) = (getpwuid("$login"));
print "\nUserinformationen fuer login: $login\n\n";
print "Login: $pw_info[0]\n";
print "Pw (encoded): $pw_info[1]\n";
print "UserID: $pw_info[2]\n";
print "GroupID: $pw_info[3]\n";
print "Kommentar: $pw_info[6]\n";
print "HomeDir: $pw_info[7]\n";
print "Shell: $pw_info[8]\n";
print "\n\n";
getservbyname - Eintrag mit bestimmtem Portnamen ermitteln
Ermittelt aus der Datei /etc/services die Portnummer zu einem bestimmten
Netzwerkdienst und erwartet als Parameter:
- den Namen des gewünschten Netzwerkdienstes,
- den Namen des gewünschten Protokolls.
Gibt die zugehörige Portnummer zurück. Wenn der übergebene
Netzwerkname oder das Protokoll nicht gefunden wurden, wird undef
zurückgegeben.
Im Listenkontext erhält man Name, Aliase, Port und Protokollnummer:
my $port = getservbyname("www","tcp");
print "$port\n";
my ($name,$aliases,$port,$number) = getservbyname("www","tcp");
print "Name: $name\n";
print "Aliases: $aliases\n";
print "Port: $port\n";
print "Proto: $number\n";
getservbyport - Eintrag mit bestimmter Portnummer ermitteln
Ermittelt aus der Datei /etc/services den Namen eines Netzwerkdienstes
zu einer bestimmten Portnummer und erwartet als Parameter:
- die gewünschten Portnummer,
- den Namen des gewünschten Protokolls.
Gibt den Namen des zugehörigen Netzwerkdienstes zurück. Wenn die
übergebene Portnummer oder das Protokoll nicht gefunden wurden, wird
undef zurückgegeben.
Im Listenkontext erhält man Name, Aliase, Port und Protokollnummer:
my $port = getservbyport(80,"tcp");
print "$port\n";
my ($name,$aliases,$port,$number) = getservbyport(80,"tcp");
print "Name: $name\n";
print "Aliases: $aliases\n";
print "Port: $port\n";
print "Proto: $number\n";
IO::Socket::INET - die Socket-Schnittstelle
IO::Socket::INET stellt eine Objektschnittstelle bereit, mit der Sockets
in der AF_INET-Domain erzeugt und verwendet werden können. Es baut
auf der IO-Schnittstelle auf und erbt alle von IO definierten Methoden.
Konstruktor new( [ARGS] )
Erzeugt ein IO::Socket::INET-Objekt, das eine Referenz auf ein neu
erzeugtes Symbol (beachten Sie hierzu auch das Symbol-Paket) darstellt.
new kann optionale Argumente verarbeiten. Diese Argumente liegen als
Schlüssel/Wert-Paare vor.
Neben den von IO akzeptierten Schlüssel/Wert-Paaren stellt
IO::Socket::INET die folgenden zur Verfügung:
PeerAddr Adresse des entfernten Hosts <hostname>[:<port>]
PeerHost Synonym für PeerAddr
PeerPort Entfernter Port oder Dienst <service>[(<no>)] | <no>
LocalAddr Lokal gebundene Hostadresse hostname[:port]
LocalHost Synonym für LocalAddr
LocalPort Lokal gebundener Host-Port <service>[(<no>)] | <no>
Proto Name/Nummer des Protokolls "tcp" | "udp" | ...
Type Socket-Typ SOCK_STREAM | SOCK_DGRAM | ...
Listen Queue-Größe für Listen
Reuse Setze SO_REUSEADDR vor Bindung.
Timeout Timeout-Wert für verschiedene Operationen
Ist Listen angegeben, wird ein Listen-Socket erzeugt. Handelt es sich
beim Socket-Typ, der aus dem Protokoll abgeleitet wird, hingegen um SOCK_STREAM,
dann wird connect() aufgerufen.
PeerAddr kann einen Hostnamen oder eine IP-Adresse der Form "xx.xx.xx.xx"
enthalten. PeerPort kann eine Zahl oder ein symbolischer Dienstname sein.
Dem Servicenamen kann in Klammern eine Zahl folgen, die verwendet wird, wenn das
System den Dienst nicht kennt. Auch PeerPort kann in PeerAddr
eingebettet werden, indem man ihm einen ":" voranstellt.
Geben Sie Proto nicht an, während Sie einen symbolischen
PeerPort festlegen, versucht der Konstruktor, Proto aus dem
Dienstnamen abzuleiten. Als letzter Ausweg wird Proto mit "tcp" angenommen.
Der Type-Parameter wird aus Proto abgeleitet, wenn er nicht
angegeben wird.
Wird dem Konstruktor nur ein einzelnes Argument übergeben, wird davon ausgegangen,
daß es sich um PeerAddr handelt. Beispiele:
$sock = IO::Socket::INET->new(PeerAddr => 'www.netzmafia.de',
PeerPort => 'http(80)',
Proto => 'tcp');
$sock = IO::Socket::INET->new(PeerAddr => 'localhost:smtp(25)');
$sock = IO::Socket::INET->new(Listen => 5,
LocalAddr => 'localhost',
LocalPort => 9000,
Proto => 'tcp');
$sock = IO::Socket::INET->new('127.0.0.1:25');
Seit der Version 1.18 ist bei allen IO::Socket-Objekten das Autoflushing
standardmäßig aktiviert. Bei früheren Releases ist das nicht der Fall.
Aktive Methoden
Diese Methoden dienen zum Aufbau bzw zur Annahme einer Verbindung. Alle Methoden
liefern einen Wert zurück.
Informations-Methoden
Die folgenden Methoden liefern Informationen über den lokalen und
den entfernten Host.
- $sock->connected()
liefert "wahr", falls der Socket eine Verbindung zum entfernten Rechner
hat - verwendet peername().
- $sock->sockaddr()
Gibt den Adreß-Teil der sockaddr-Struktur des Sockets zurück.
- $sock->sockport()
Gibt die Portnummer zurück, die das Socket auf dem lokalen Host verwendet.
- $sock->sockhost()
Gibt den Adreß-Teil der sockaddr-Struktur des Sockets in der Form "xx.xx.xx.xx"
zurück.
- $sock->sockname()
gibt nicht den Namen, sondern die gepackte Binäradresse des lokalen Hosts
zurück.
- $sock->peeraddr()
Gibt den Adreß-Teil der sockaddr-Struktur des Sockets auf dem entfernten Host
zurück.
- $sock->peerport()
Gibt die Portnummer des Sockets auf dem entfernten Host zurück.
- $sock->peerhost()
Gibt den Adreß-Teil der sockaddr-Struktur des Sockets auf dem entfernten
Host in der Form "xx.xx.xx.xx" zurück.
- $sock->peername()
gibt nicht den Namen, sondern die gepackte Binäradresse des entfernten Hosts
zurück.
- $sock->protocol()
$sock->socktype()
$sock->sockdomain
liefern Basisinformationen über den entsprechenden Socket. Sie können
nicht verwendet werden, um Eigenschaften des Socket zu ändern.
|
|
|