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
Server Design Alexander Sczyrba Madis Rumming

2 Übersicht Wiederholung Konkurierende Verbindungen

3 Wiederholung use strict; use IO::Socket::INET;
my $socket = IO::Socket::INET->new( LocalPort => $server_port, Listen => SOMAXCONN, ReuseAddr => 1); while (my $connect = $socket->accept) { print "accepting connection\n"; foreach (1..10) { $connect->print(scalar(localtime()),"\n"); sleep(1); } print "closing connection\n"; $connect->close; }

4 Was unterscheidet daytime.pl von einem „richtigen“ Server?
Aufgaben Starte den Server daytime.pl aus dem Übungsarchiv und versuche, Verbindung mit telnet oder dem einfachen Client aus der sechsten Stunde aufzunehmen. Was unterscheidet daytime.pl von einem „richtigen“ Server? Der daytime-Server kann immer nur eine Verbindung gleichzeitig abarbeiten. Es können zwar mehrere Clients Verbindung aufnehmen, aber sie werden sequentiell abgearbeitet. Die Zahl der Clients in der Warteschlange kann nicht beliebig groß werden, sie ist durch die listen queue begrenzt.

5 Wiederholung, cont. Probleme: nur ein Client gleichzeitig Anzahl akzeptierter Clients abha¨ngig von listen queue iterative server Lösungen: gelerntes anwenden fork() select() $socket->blocking(0) Threads concurrent server

6 Arbeitsweise Server, rev.

7 Sorge dafür das die Kind Prozesse nicht zu Zombies werden.
Aufgaben Erweitere den iterativen daytime-Server so, daß Anfragen von einem Kind-Prozeß verarbeitet werden und der eigentliche Server sofort neue Verbindungen akzeptieren kann. Was ist alles zu beachten ? Sorge dafür das die Kind Prozesse nicht zu Zombies werden. forking server, noch nicht vollsta¨ndig: while (my $connect = $socket->accept) { my $cpid = fork(); if (defined($cpid)) { if ($cpid == 0) { # child $socket->close; my $client_port = $connect->peerport(); my $client_host = $connect->peerhost(); print scalar(localtime()), " - accepting connection from $client_host:$client_port\n"; foreach (1..10) { $connect->print(scalar(localtime()),"\n"); sleep(1); } print "closing connection\n"; $connect->close; exit; } else { # parent } else { die "can’t fork: $!\n"; Diese Version hinterläßt Zombies, da sie nicht wait() aufruft.

8 Lösung in erster Näherung:
Probleme Lösung in erster Näherung: $SIG{CHLD} = sub { wait(); }; while (my $connect = $socket->accept) { my $cpid = fork(); if (defined($cpid)) { Problem: Server beendet sich nach einem Kind-Prozeß alternativer Code: while (1) { my $connect = $socket->accept; my $cpid = fork();

9 Aufgaben Nachdem sich der erste Kind-Prozeß beendet hat, bricht der Server mit einer Fehlermeldung ab. Versuche herauszufinden, was den Fehler verursacht. Tipp: Der Fehler ist nur eine Folgeerscheinung. Werte an der ”richtigen“ Stelle $! aus. Weitere Hinweise liefert die man-page zur C-Version von accept(): $ man -s 3 accept oder im WWW unter Wie muß der Server-Code aussehen, um das Problem zu umgehen? Das Problem ist, daß der accept()-Aufruf vom SIGCHLD des Kind-Prozesses unterbrochen wird. Dadurch liefert accept den Wert undef zurück und $! enthä lt Interrupted system call Siehe dazu die Beschreibung des Fehlers EINTR in der man-page vo accept. • Dieser Fall muß abgefangen werden: while (1) { my $connect = $socket->accept; next unless defined($connect);

10 Aufgaben Was passiert, wenn der Client vorzeitig die Verbindung schließt ? Sorge dafür, daß das Problem umgegangen wird und die Kind-Prozesse ordnungsgemäß beendet werden ? Wenn der Client vorzeitig die Verbindung schließt, erha¨ lt der entsprechende Kind-Prozeß ein SIGPIPE und beendet sich. Dies ist in dem vorliegenden Beispiel nicht weiter tragisch, aber in realen Servern sollte der Prozeß die Mo¨ glichkeit haben, angemessen darauf zu reagieren. • Die Lo¨ sung besteht darin, einen entsprechenden Handler fu¨ r dieses Signal einzurichten: $SIG{PIPE} = sub { die "exiting: $!\n"; };


Herunterladen ppt "Netzwerk - Programmierung"

Ähnliche Präsentationen


Google-Anzeigen