Die Präsentation wird geladen. Bitte warten

Die Präsentation wird geladen. Bitte warten

Netzwerk - Programmierung

Ähnliche Präsentationen


Präsentation zum Thema: "Netzwerk - Programmierung"—  Präsentation transkript:

1 Netzwerk - Programmierung
I/O Multiplexing Alexander Sczyrba Madis Rumming

2 Übersicht Unbuffered I/O Multiplexing mit select

3 Problem: Wann schreiben? Wann lesen?
Einleitung Problem: Wann schreiben? Wann lesen? Lösung der letzten Stunde: Entkopplung durch zwei Prozesse weitere Möglichkeit: Multiplexing zwei Verfahren: select: schreibe/lese nur dann, wenn möglich nonblocking I/O: Operationen blockieren nie echoclient.pl: #!/usr/bin/env perl use IO::Socket; my $host = shift || ’localhost’; my $port = shift || ’echo’; my $socket = IO::Socket::INET->new("$host:$port") or die "Can’t connect to port $port at $host: $!\n"; while (defined(my $msg_out = <STDIN>)) { print $socket $msg_out; my $msg_in = <$socket>; print $msg_in; } $socket->close;

4 Input/Output unbuffered vs. buffered I/O print, <HANDLE>, : Lese-/Schreibpuffer ungepufferte low-level-Funktionen: sysread, syswrite nachfolgende Verfahren verwenden unbuffered I/O

5 Liefert ”0“ bei end of file, undef bei Fehler schreiben:
sysread/syswrite lesen: my $buflen = 1024; my $buffer; my $size = sysread($socket, $buffer, $buflen); Liefert ”0“ bei end of file, undef bei Fehler schreiben: my $buffer = "hello world"; my $size = syswrite($socket, $buffer); schreibt eventuell nur Teil des Puffers IO::Handle: gleichnamige Methoden nicht mit buffered I/O mischen Im Listen-Kontext liefern die gethostby*-Funktionen weitere Informationen: ($name, $aliases, $type, $len, $iaddr) = gethostbyname($reqname); ($name, $aliases, $type, $len, $iaddr) = gethostbyaddr($reqiaddr, AF_INET);

6 SIZE = syswrite(FILEHANDLE, SCALAR, LENGTH)
Aufgaben Schreibe die simplen Varianten von Client und Server aus dem Übungsarchiv der letzten Stunde so um, daß sie via unbuffered I/O über die sockets kommunizieren. Worauf ist beim Server zu achten? Verwende die alternative Variante von syswrite: SIZE = syswrite(FILEHANDLE, SCALAR, LENGTH) Setze für LENGTH einen Wert von 6 Bytes ein. sysread client.pl: my $buflen=1024; my $buffer; while (sysread($socket, $buffer, $buflen) != 0) print $buffer; syswrite server.pl: syswrite($connect, "hello $pname, nice to meet you\n"); syswrite($connect, "it’s ".localtime()."\n"); besser: sub writesocket { my ($handle, $buffer) while ($buffer) { my $len = syswrite($handle, $buffer); # print STDERR "written $len bytes\n"; $buffer = substr($buffer, $len); }

7 Multiplexing mit select
Idee: überwache file-/sockethandles teste, ob handle ausgelesen oder beschrieben werden kann OO-Interface: IO::Select my $select = IO::Select->new(); $select->add($socket); $select->add(\*FILE); $select->remove($socket); my $num = $select->count(); my $val = $select->exists(\*FILE2); = $select->handles(); Auch diese Funktionen liefern im Listen Kontext weitere Informationen zurueck.

8 IO::Select verwenden Zustand der handles abfragen:
= $select->can_read(); = $select->can_write(); = $select->has_exception(); Rückgabewert: Array von handles blockieren, bis mind. ein handle schreib-/lesbar ist optionales Argument: timeout in Sekunden

9 can_read() handle kann gelesen werden, wenn . . .
mindestens 1 Byte Daten vorhanden sind sysread() wird nicht blockieren oder EOF vorliegt sysread() wird ”0“ zurückliefern oder Fehler vorliegt sysread() wird undef zurückliefern

10 can_write() handle kann beschrieben werden, wenn . . .
mindestens 1 Byte geschrieben werden kann syswrite() wird bei einem Byte nicht blockieren kann blockieren, falls mehr Daten geschrieben werden oder Fehler vorliegt sysread() wird undef zurückliefern

11 Aufgaben Schreibe einen nicht-forkenden Client, der Eingaben von der Tastatur an einen Server weitergibt und dessen Antworten auf dem Bildschirm ausgibt. Verwende IO::Select. Teste das Programm wieder mit dem Echo- und dem Whois-Server. select client.pl: use IO::Select; # create Select object, listen to STDIN and socket my $select = IO::Select->new() || die "can’t create Select object: $!\n"; $select->add(\*STDIN); $select->add($socket); my $buflen=1024; my $buffer; my $running = 1; $| = 1; while ($running) { = $select->can_read(); foreach my $reader { if ($reader eq \*STDIN) { my $len = sysread(STDIN, $buffer, $buflen); $running = 0 unless $len; syswrite($socket, $buffer); } elsif ($reader eq $socket) { my $len = sysread($socket, $buffer, $buflen); print $buffer; }


Herunterladen ppt "Netzwerk - Programmierung"

Ähnliche Präsentationen


Google-Anzeigen