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
Concurrent Clients Alexander Sczyrba Madis Rumming

2 Übersicht Server-Implementierung mit IO::Socket TCP Echo Client Concurrent Clients

3 Schreibe mit Hilfe von IO::Socket einen Client, der
Aufgabe Schreibe mit Hilfe von IO::Socket einen Client, der • zeilenweise Eingaben an den Server schickt • und Ausgaben vom Server zeilenweise ausgibt Wie verhält sich Dein Client bei einem echo-Server (vgl. Material zu Programmieren mit Sockets)? Wie verhält er sich bei einem whois- Server (bspw. ’whois.arin.net’, Port 43)? Vergleiche dazu die Ausgabe mit z.B. whois -h whois.arin.net google.com. Wo liegt das Problem? 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 Problematischer Client
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;

5 Auch folgender Versuch schlägt fehl:
Deadlocks Auch folgender Versuch schlägt fehl: while ($from_server = <$socket>){ print $from_server; … } Server und Client warten gleichzeitig auf Eingaben und Erzeugen so einen Deadlock. 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 Parent kopiert die Daten vom Client zum Server
Concurrent Clients Lösung : Entkoppeln der lesenden und schreibenden Prozesse durch fork() Parent kopiert die Daten vom Client zum Server Child liest Daten von Server Problem: korrektes Beenden der Prozesse addrconv.pl: use Socket; = qw(goldfinger goldfinger.TechFak.Uni-Bielefeld.DE foreach $in_name { # my $iaddr = gethostbyname($in_name); my $iaddr = inet_aton($in_name); my $dotqd = inet_ntoa($iaddr); my $out_name = gethostbyaddr($iaddr, AF_INET); print "$in_name -> $iaddr -> $out_name ($dotqd)\n"; }

7 Verbindungsabbau forked Client
Server Server Server Server Server sleep() sleep() sleep() exit() exit() Parent Child Parent Child Parent Child Parent Parent Child Parent CHLD Zeit Auch diese Funktionen liefern im Listen Kontext weitere Informationen zurueck.

8 Aufgabe Schreibe einen Client, der folgendermassen aufgebaut ist:
Socket erzeugen fork() Parent kopiert von STDIN zum Socket (user2host()) Child kopiert vom Socket nach STDOUT (host2user()) Parent reagiert auf Signal CHLD und beendet sich Parent initiiert shutdown(1), wenn User-Eingabe beendet Child beendet sich bei EOF vom Server


Herunterladen ppt "Netzwerk - Programmierung"

Ähnliche Präsentationen


Google-Anzeigen