Server

Server-Programme mit Perl

Die Kommunikation zwischen AuftragGeber (Client) und AuftragNehmer (Server) ist ein grundlegendes Element der Informatik. Auf dieser Seite wird demonstriert, wie man mit Perl einfache Client-Server-Experimente ausführen kann.
Perl Scripts für CGI und Systemverwaltung
Client-Server AuftragGeber (Client) und AuftragNehmer (Server)
Single-Client Server Einfaches Beispiel für gleichzeitig nur 1 Verbindung
Multi-Client Server Einfaches Beispiel für einen Server mit Child-Prozessen
Verwandte Themen Client, Child-Prozesse

Client-Server

Server-Programme

sind die Dienstleister (AuftragNehmer) der modernen Informatik. In der Praxis laufen auf jedem PC zahlreiche (unbemerkte) Server-Programme. Man kann sie sichtbar machen, indem man z.B. das Windows-Programm TaskManager (taskmgr.exe) startet und das Register 'Prozesse' anzeigt.

Server-Programme (services, daemons) laufen im 'Hintergrund' - Sie verwenden kein Fenster und werden nicht durch Maus oder Tastatur gesteuert. Sie werden normalerweise nicht manuell (von einem menschlichen User) gestartet sondern automatisch nach dem System-Start.

Server-Programme erhalten ihre Aufträge über das Netzwerk. Dazu braucht man nicht einmal ein reales Netzwerk, denn jeder PC kann solche Aufträge an 'eigene' Server-Programme erteilen.

In jedem größeren Netzwerk läuft mindestens ein PC als 'Server-PC': Ein derartiger PC ist auf Server-Programme spezialisiert. Dort befindet sich kein PC-Arbeitsplatz, oft sind auch keine User-Programme installiert. Am Server-PC laufen normalerweise mehrere Server-Programme, deren Dienste von allen Arbeits-PC des Netzwerks genutzt werden.

Häufig verwendete Server-Programme sind z.B. Proxy-Server (Router), FileServer (Windows-'Netzlaufwerk'), DruckServer, WebServer, Datenbank-Server, ...
Der WebServer (HTTP-Server) entwickelt sich zur zentralen Drehscheibe jedes professionell organisierten Netzwerks.
Auf dieser Seite werden experimentelle Server vorgestellt: Man kann damit die Funktionsweise von Client-Server Systemen demonstrieren. Diese Demo-Server führen darüber hinaus keine nützliche Arbeit aus - Man kann eine solche jedoch selbst programmieren.

Client-Programme

Sind die AuftragGeber der modernen Informatik. Sie enthalten das gesamte User-Interface:

Damit werden die Wünsche menschlicher AnwenderInnen in Aufträge an Server 'übersetzt'.
Die Aufträge werden über das Netzwerk an den Server-PC und dort an das 'zuständige' Server-Programm gesendet.
Das Client-Programm empfängt anschließend die vom Server erhaltenen Antwort-Daten und übersetzt sie in eine für menschliche AnwenderInnen brauchbare Form.

Das meist-verwendete Client-Programm ist ein Browser ( = HTTP-Client):
Ein Browser nimmt Aufträge entweder durch Eingabe in die Adress-Zeile oder durch Anklicken eines Links entgegen.
Der Auftrag wird (meist als HTTP-GET-Request) an das Ziel gesendet - normalerweise an einen Webserver.
Die erhaltenen Daten (z.B. lesbarer HTML-Quelltext oder binär codierte Grafik-Dateien) werden zu einer Webseite zusammengesetzt, diese wird vom Browser angezeigt.

Client und Server bilden ein auf eine bestimmte Aufgabe spezialisiertes Paar. Ein Browser benötigt als Partner einen oder mehrere Webserver, ein Mail-Programm braucht als Partner Mail-Server usw.

Für die hier vorgestellten Demo-Server kann man unterschiedliche Clients verwenden, z.B. Browser, Telnet-Programme oder spezialisierte → Client-Programme.

IP-Adresse

Jedes in ein Netzwerk integrierte Gerät wird durch eine (innerhalb des Netzwerks) eindeutige IP-Adresse bezeichnet.

Eine typische Adresse im eigenen lokalen Netzwerk ist z.B. 192.168.0.1

Man muss die IP-Adresse des Server-PC kennen, um mit ihm in Verbindung zu treten. An Stelle der IP-Adresse können evtl. PC-Namen (im eigenen Netzwerk) oder Domain-Namen (im Internet treten).

Ein besonderer Name ist localhost, entsprechend der reservierten IP-Adresse 127.0.0.1
Damit wird immer der 'eigene PC' bezeichnet. Wenn man mit dieser Adresse verbindet, dann richten sich die Aufträge an Server-Programme des eigenen PC, unabhängig von seiner nach außen wirksamen IP-Adresse.

Details zum Thema IP-Adressen

Port

An jedem Gerät (z.B. PC) laufen gleichzeitig mehrere Server-Programme. Zur Unterscheidung verwendet man den Begriff 'Port' als eine Sub-Adresse der jeweiligen IP-Adresse.

Ein Auftrag von einem Client-Programm an ein Server-Programm benötigt daher sowohl die IP-Adresse als auch den Port des Servers. Die Port-Nummer ist für jeden Server-Typ standardisiert ('well-known port') und daher jedem Client-Programm bekannt.

Beispiel: Jeder Standard Webserver erwartet Aufträge an Port 80, jeder Browser sendet seine Aufträge ohne weitere Maßnahmen an Port 80 der jeweiligen IP-Adresse.

Die Port-Nummer des hier vorgestellten Demo-Servers ist frei wählbar und muss daher jedem Client-Programm ausdrücklich mitgeteilt werden.

Details zum Thema Port

Socket

Die Kombination aus IP-Adresse und Port wird mit 'Socket' bezeichnet.

Jeder Server lauscht an einem eindeutig definierten Socket, d.h. er wartet an der bezeichneten IP-Adresse und an diesem Port auf Client-Aufträge.

Jedes am Server-PC eintreffende Daten-Paket muss die Port-Nummer des Ziels enthalten. Das Betriebssystem leitet die Daten an das damit angegebene Server-Programm weiter.

Auch Client-Programme benötigen eine Port-Nummer, damit die vom Server zurück kommenden Daten an das zuständige Client-Programm geleitet werden.
Dazu erhält ein Client-Programm für jeden einzelnen Auftrag eine eigene Port-Nummer, welche vom Betriebssystem des Clients vergeben wird.
Diese Client Port-Nummern sind variabel und temporär: Man kann sie als User nicht auswählen. Nach Abschluss eines Auftrags kann das Betriebssystem die gleiche Port-Nummer für einen anderen Auftrag vergeben.

Protokoll

Zur Kommunikation in einem Netzwerk kann man unterschiedliche 'Protokolle' verwenden. Dieser Begriff summiert alle Regeln, nach denen der Transport der Daten erfolgen soll.

Die meist-verwendeten Protokolle sind → TCP und → UDP. Oft wird eine Verbindung mit dem Begriff 'TCP/IP' charakterisiert.

Das Protokoll TCP ist besonders sicher, d.h. es kann die häufigsten Übertragungs-Fehler erkennen und (in Grenzen) korrigieren.
Der hier vorgestellte Demo-Server verwendet TCP.

Das Protokoll UDP ist einfacher und schneller, jedoch weniger sicher. Um dieses Protokoll zu verwenden, ersetzen sie 'tcp' im Server-Programm durch 'udp'.

Single-Client Demo-Server

Einfaches, jedoch funktionsfähiges Server-Programm:

Vorgaben:

Der Server-Port ist beliebig im Bereich 1024...65535 wählbar
Der Timeout steuert den Abbruch der Verbindung, wenn der Client keine (weiteren) Daten sendet.
Das Zeilen-Ende $eol kann für verschiedene Clients optimiert werden.

Socket

Ein → TCP-Socket wird mit den Methoden des Perl-Moduls IO::Socket hergestellt. Die Verbindungs-Daten des gestarteten Servers werden am Server-Terminal angezeigt.

Listen-Schleife

In einer while-Schleife wartet (lauscht) das Server-Programm auf das Eintreffen eines Client-Auftrags (Request). Dieses Ereignis wird von der accept-Methode geliefert.
Danach werden die Verbindungs-Daten sowohl am Server-Terminal (mit print )angezeigt, als auch (mit print $sock) an den Client gesendet. Das Unterprogramm print_both fasst lediglich beide Ausgaben zusammen.
Diese Schleife wird ohne zusätzliche Maßnahmen nur durch Abbruch des Programms (z.B. am Server-Terminal) beendet.

Kommunikation (Dialog-Schleife)

Der Server kann nun über den Kanal <$sock> Daten vom Client erhalten und über den Socket $sock selbst Daten an den Client senden.
Als 'Dienstleistung' sendet der Server jede vom Client erhaltene Daten-Zeile $cline wieder (nummeriert) an diesen zurück.
Abbruch: Die Dialog-Schleife würde ohne zusätzliche Maßnahmen endlos laufen: Der Server wartet geduldig auf weitere Daten des Client.
Daher wurden 3 unabhängige Abbruch-Kriterien eingebaut: Timeout, Leerzeile und ein BefehlsWort (quit).

Timeout

Wenn ein verbundener Client in der eingestellten Ablaufzeit $timeout_seconds keine weitere Daten sendet, dann wird die Verbindung abgebrochen.
Dazu wird der zu überwachende Programm-Teil in einen eval{}-Block eingeschlossen. Am Beginn dieses Blocks wird ein unbenanntes Unterprogramm als Handler für das Signal $SIG{ALRM} definiert. Unmittelbar danach wird mit alarm ein Abbruch programmiert.
Nach jedem Eintreffen einer Daten-Zeile vom Client wird der Timeout mit einer weiteren alarm-Anweisung erneuert (verlängert).

Leerzeile

Wenn der Client eine Leerzeile sendet, wird die Verbindung sofort abgebrochen.

Quit

Wenn im Client-Text das Wort quit enthalten ist, dann wird die Verbindung abgebrochen.

Stop

Wenn im Client-Text das Wort stop enthalten ist, dann wird nicht nur die Client-Verbindung sndern der gesamte Server beendet.

Abbruch des Dialogs

Nach Abschluss des eval{}-Blocks wird ein allfälliges Ergebnis $@ untersucht und angezeigt.
Der Abbruch (close $sock) wird am Server-Terminal angezeigt und als letzte Meldung an den Client gesendet.
Danach kehrt das Programm in die äußere Schleife (Listen-Loop) zurück: Der Server ist bereit für einen weiteren Client-Auftrag (Request).

Abbruch des Server-Programms

Übliche Server-Programme laufen unbegrenzt (bis zur Abschaltung shutdown des Server-PC) und lassen sich durch Clients nicht abgeschalten.
In das Beispiel wurde ausnahmsweise ein Abbruch-Kriterium eingebaut:
Wenn eine vom Client gesendete Text-Zeile das Wort stop enthält, dann wird die Variable $do_listen abgeschaltet und danach die Listen-Schleife mit last beendet.

Hilfs-Programme

Das sub iso gibt eine nach Standard → ISO-8601 formatierte Zeit-Marke zurück.
Das sub print_both erwartet als Argument einen Text und gibt diesen sowohl an die Server-Konsole als auch an den Kanal zum Client aus.
Single-Client Server-Programm server_1.pl
#!/usr/bin/perl
#!C:\Programme\Perl\bin\perl.exe
use strict;
use IO::Socket;
use POSIX;
print "--- Perl Demo-Server 1 ---\n";


##### Vorgaben #####
my $srv_port=12345;
my $timeout_seconds=3;
# my $eol="\n\r";   # Telnet-Client
my $eol="\n"; # Browser-Client

##### Start Server #####
my($sock,$csock,$srv_ip);
my($peer,$cli_port,$cli_ip,$cli_adr);
my($linr,$cline,$txt,$do_listen);
$sock=IO::Socket::INET->new(
Proto=>'tcp',
LocalPort => $srv_port,
Listen => SOMAXCONN);
$sock or die "Error: No socket: $!\n";
print '# Demo-Server listening on port '.$srv_port.' since '.iso()."\n";
print '# Timeout = '.$timeout_seconds." s\n";
print '# Process Nr = '.$$."\n";
$do_listen=1;

##### Server-Listen-Loop #####
while(($csock,$peer)=$sock->accept()) {
# Request from a Client:
($cli_port,$cli_adr)=sockaddr_in($peer);
$cli_ip=inet_ntoa($cli_adr);
$srv_ip=$csock->sockhost;
print $csock '# Demo-Server '.$srv_ip.':'.$srv_port.' @ '.iso().$eol;
$txt='# Request from Client '.$cli_ip.':'.$cli_port.' @ '.iso();
print_both($txt);
print $csock 'Text (lines) received from Client:'.$eol;

eval {
local $SIG{ALRM}=sub{die "timeout\n";};
alarm($timeout_seconds);
$linr=0;
### Dialog-Loop ###
while($cline=<$csock>) {
$cline=~s/\[x0D\x0A9]//g; # trim
if($cline) {
# Text-Line from Client
$linr++;
alarm($timeout_seconds);
print_both('('.$linr.') '.$cline);
# Check quit/stop:
if($cline=~m/quit/i) {last;}
elsif($cline=~m/stop/i) {
$do_listen=0; last;
}
}
else{last;} # empty line
} # end while dialog
alarm(0);
}; # end eval
if ($@) {
if ($@=~/^timeout/) {
print_both('# Timeout');
}
else {print '## Error: '.$@."\n";}
}

### Close dialog ###
$txt='# Socket closed to Client '.$cli_ip.':'.$cli_port.' @ '.iso();
print_both($txt);
close $csock;
if(!$do_listen) {last;}
} # end Server listen-loop
close $sock;
print 'Exit Demo Server @ '.iso()."\n";

sub iso{
my $iso=strftime('%Y-%m-%d %H:%M:%S',localtime(time()));
return $iso;
}

sub print_both {
my($txt)=@_;
print $txt."\n"; # Server-Terminal
print $csock $txt.$eol; # Client
}

Start des Servers:

Öffnen sie eine → Konsole (→ Linux-Shell oder Windows-→ 'Eingabeaufforderung' cmd.exe) und starten sie das Server-Programm, z.B.
# /home/ich/perl_server_1.pl
Auf Windows müssen sie je nach → Konfiguration evtl. auch das Perl Interpreter-Programm angeben:
C:\> perl_server_1
C:\> perl_server_1.pl
C:\> c:\programme\perl\bin\perl.exe c:\perl_server_1.pl
Der Server sollte starten und einige Daten anzeigen:
...listening since ...
Beachten sie die angezeigte Port-Nummer: Nur auf diesem Port kann man mit dem Server Verbindung aufnehmen.

Firewall:

Wenn an einem der beteiligten PC (Client oder Server) ein Firewall läuft, dann müssen sie auf jedem dieser Firewalls die Verbindung mit dem gewählten Port freigeben / erlauben.

Lassen sie das Fenster mit der Server-Konsole offen und beobachten sie die mit jedem Client-Auftrag erfolgende Ausgabe.

Beenden sie den Server entweder durch Eingabe eines Textes mit zzz am Client oder durch Abbruch mit Strg-C an der Server-Konsole.

Client

Ein Client-Programm kann am gleichen PC laufen oder auf einem beliebigen anderen PC des lokalen Netzwerks. Es muss lediglich die Verbindung funktionieren (und von allfälligen Firewalls erlaubt werden).

Browser als Client

Jedes Browser-Programm lässt sich als Client verwenden. Geben sie dazu die IP-Adresse, einen : Doppelpunkt als Trennzeichen und den Port des laufenden Servers in die Browser-Adresszeile ein, z.B.
http://192.168.0.1:12345
Ändern sie IP-Adresse und Port nach Bedarf.
Der Server zeigt jedesmal den vom Browser gesendeten Text (→ HTTP-Request) an. Der Demo-Server erhält diesen Text ebenso wie jeder Web-Server, sendet jedoch als Antwort keine Webseite sondern den gleichen Text (lediglich mit nummerierten Zeilen).
Darüber hinaus ist mit einem Browser kein Dialog mit dem Demo-Server möglich.

Telnet-Client

Jedes Betriebssystem bietet das kaum mehr verwendete Konsolen-Programm telnet
Darüber hinaus kann man aus dem Internet kostenfreie Telnet Client Programme laden.
Mit telnet kann man einen interaktiven Dialog mit dem Demo-Server führen:
Starten sie eine Konsole und geben sie die IP-Adresse, ein Leerzeichen als Trennzeichen und den Port des laufenden Servers ein, z.B.
# telnet 192.168.0.1 12345
Wenn die Verbindung klappt, wird die Konsole gelöscht und die vom Server gesendeten Daten angezeigt.
Sie können manuell beliebige Daten-Zeilen eingeben und zeilenweise an den Server senden.
Der Server antwortet mit dem gleichen Text.
Wenn sie eine Leerzeile eingeben oder mit der Eingabe länger warten als die eingestellte Timeout-Zeit, dann wird die Verbindung abgebrochen.
Wenn die Vorgabe-Variable $eol für Browser optimiert ist, dann wird von telnet kein Zeilenrücklauf (CR) angezeigt - Das erfordert etwas Phantasie bei der Ansicht, oder eine Änderung dieser Variablen im Server-Programm.

Perl-Client

In diesem Web werden → Perl Client Programme vorgestellt, die sich besonders f%uuml;r Client-Server Experimente eignen.

Kritik

Das Beispiel ist ein Kompromiss: Man könnte es noch weiter vereinfachen, dann würde die Leistung des Servers jedoch unter ein brauchbares Minimum sinken.

Das Beispiel eignet sich gut für eigene Experimente:
Man kann den vom Client eintreffende Text $cline analysieren und beliebig verarbeiten.
Mit print $sock kann man beliebige Texte an den Client ausgeben, z.B. HTML-Webseiten.
Das Server-Programm ist nicht auf die Ausgabe von Text beschränkt: Als Reaktion auf bestimmte Eingabe-Texte (individuelle 'Befehle') kann es auch beliebige andere Arbeiten (z.B. im Dateisystem des Server-PC) ausführen.

Für einen auch nur halbwegs professionellen Betrieb muss der Demo-Server jedoch noch um viele weitere Maßnahmen ergänzt werden.

Andere Perl-Module

Ein einfacher Demo-Server lässt sich alternativ mit zahlreichen anderen Perl-Modulen herstellen. Dieses Beispiel wurde gewählt, weil das verwendete Modul IO::Socket fast immer verfügbar ist, weil das damit hergestellte Programm auf allen gängigen Systemen funktioniert, und weil sich dieses Programm mit eigenen Ideen leicht verändern lässt.
Tipp: Perl bietet Module, die fertige, auf bestimmte Arbeiten spezialisierte Server enthalten.

Single-Client

Die wichtigste Einschränkung dieses Demo-Servers:
Während ein Client mit dem Server verbunden ist, kann kein weiterer Client Verbindung aufnehmen. Dieses 'exklusive' Verhalten ist nur in seltenen Fällen erwünscht: Normalerweise soll ein Server-Programm (beliebig) viele Clients gleichzeitig bedienen (↓ nächstes Kapitel).
Eine Ausnahme sind Arbeiten am Server-PC selbst, z.B. Schreiben einer Datei: In diesem Fall soll die Arbeit des Client nicht durch andere Prozesse gestört werden.

Multi-Client Server mit Child-Prozessen

Einfaches, jedoch funktionsfähiges Server-Demo Programm:

Vorgaben:

Der Server-Port ist beliebig im Bereich 1024...65535 wählbar.

Socket

Ein → TCP-Socket wird mit den Methoden des Perl-Moduls IO::Socket hergestellt.

Process-ID-Nr

Die Variable $$ enthält die PID-Nr des jeweiligen Prozesses. Die PID des Parent wird in der Variablen $pid gespeichert. Jeder Child-Prozess hat eine andere PID, die zwar angezeigt, jedoch in diesem Programm nicht verwendet wird.

Listen-Schleife

In einer while-Schleife wartet (lauscht) das Parent-Programm auf das Eintreffen eines Client-Auftrags (Request). Dieses Ereignis wird von der accept-Methode geliefert und in der Variablen $csock gespeichert.

Prozess-Teilung

Unmittelbar nach Erzeugung einer Verbindung $csock wird ein fork-Prozess durchgeführt.
Im Parent-Prozess wird lediglich der dort nicht benötigte Socket $csock geschlossen. Unmittelbar danach kann vom Parent mit accept ein neuer Socket zu einem anderen Client geöffnet werden.
Im Child-Prozess wird die gesamte weitere Kommunikation mit dem soeben verbundenen Client durchgeführt. Mehrere gleichzeitig laufende Child-Prozesse verwenden dazu je eine individuelle Kopie der Variablen $csock

Dialog

Der Child-Prozess erhält in einer while-Schleife je eine Zeile der Client-Anweisungen in der Variablen $cline
Diese Variable wird analysiert und auf 5 verschiedene Befehls-Worte analysiert: help, date, time quit, stop

Die Client-Befehle Help, Date, Time liefern je eine Text-Zeile als Beispiel für die nutzbare Server-'Leistung'.
Der Client-Befehl Quit führt mit Anweisung last zum Verlassen der Dialog-Schleife: Der Child-Prozess wird mit exit beendet und die Verbindung zum Client abgebrochen.
Der Client-Befehl Stop beendet das Parent-(Server)-Programm und danach sich selbst.
#!/usr/bin/perl
#!C:\Programme\Perl\bin\perl.exe

use strict;
use IO::Socket;
use POSIX;
print "--- Perl Forking Server Demo ---\n";

##### Vorgaben #####
my $srv_port = 12345;

##### Socket #####
my $sock = new IO::Socket::INET(
LocalPort => $srv_port,
Proto => 'tcp',
Listen => SOMAXCONN);
$sock or die "Error: No socket: $!\n";
STDOUT->autoflush(1);
my($csock,$cline,$ppid,$cpid);
$ppid=$$; # parent PID

##### Listen-Schleife #####
while ($csock = $sock->accept()) {
$cpid = fork();
if (!defined($cpid)) {die "Fork error ";}
if ($cpid) {
print "Parent: ppid=$pid=$$, cpid=$cpid\n";
close $csock;
}
else{ # Child process if cpid=0
print "Child: ppid=$ppid, cpid=$$\n";
close $sock;
print $csock "Here is the forking server.\n";
while (defined($cline = <$csock>)) {
$cline=~s/[\x0D\x0A]//g; # trim
print "child cline=<$cline>\n";
if($cline=~m/help/i || $cline=~m/\?/) {
print $csock "help, date, time, quit, stop\n";
}
elsif($cline=~m/date/i) {
print $csock strftime('%Y-%m-%d',localtime(time()))."\n";
}
elsif($cline=~m/time/i) {
print $csock strftime('%H:%M:%S',localtime(time()))."\n";
}
elsif($cline=~m/quit/i) {
print $csock "Quit detected";
print "Client Quit detected\n";
last;
}
elsif($cline=~m/stop/i) {
print $csock "STOP detected";
print "Server STOP detected\n";
kill 9,$ppid;
last;
}
else{print $csock "Unknown: <$cline>\n";}
} # end while
print "Child exit\n";
exit 0;
} # end child process
} # end while accept
print "Never executed\n";

Start des Servers:

Öffnen sie eine → Konsole (→ Linux-Shell oder Windows-→ 'Eingabeaufforderung' cmd.exe) und starten sie das Server-Programm, z.B.
# /home/ich/perl_server_2.pl
Auf Windows müssen sie je nach → Konfiguration evtl. auch das Perl Interpreter-Programm angeben:
C:\> perl_server_2
C:\> c:\programme\perl\bin\perl.exe c:\perl_server_2.pl

Client

Als Client-Programm eignet sich u.a. ein Browser, ein Telnet-Client oder ein spezielles Client-Programm - am gleichen PC oder an jedem anderen PC des lokalen Netzwerks. Ersetzen sie IP-Adresse und Port der folgenden Beispiele durch die jeweils realen Daten ihres Servers.

Browser:
http://192.168.0.1:12345
Der Server zeigt den gesamten vom Browser gesendeten HTTP-Request Text an und sendet ihn als 'unbekannte Befehle' an den Browser zurück.

Telnet:
C:\> telnet 192.168.0.1 12345
help
time
quit
Ein Telnet-Client erlaubt einen interaktiven Dialog mit dem Server. Man kann beliebige Texte eingeben, z.B. die 5 vom Server erkannten Befehls-Worte.
Mit quit wird der Dialog beendet.

Kritik

Das Beispiel eignet sich gut für eigene Experimente: Der vom Client eintreffende Text $cline kann analysiert und beliebig verarbeitet werden. Mit print $sock lassen sich beliebige Texte an den Client ausgeben.
Das Server-Programm ist nicht auf die Ausgabe von Text beschränkt: Als Reaktion auf bestimmte Eingabe-Texte (individuelle 'Befehle') kann es auch beliebige andere Arbeiten (z.B. im Dateisystem des Server-PC) ausführen.

Für einen auch nur halbwegs professionellen Betrieb müsste der Demo-Server um viele weitere Maßnahmen ergänzt werden, z.B. die sichere Abschaltung aller Child-Prozesse nach dem Stop des Servers.

Server-Stop

Im Gegensatz zu professionellen Server-Programmen bleibt dieser Demo-Server an jene Konsole (Terminal) gebunden, an welcher er gestartet wurde.
Man kann diesen Server an der Konsole mit Strg-C beenden. Reale Server werden nach dem Start vom Terminal getrennt, laufen unabhängig weiter und lassen sich an der Konsole (auf diese Weise) nicht mehr stoppen.
Ausnahmsweise kann man den Server auch von jedem Client mit dem Befehl Stop beenden - Das dient nur zur Demonstration und ist natürlich auf realen Server-Programmen ausgeschlossen.

Ausgabe

An der Server- Konsole werden zur Vereinfachung alle wesentlichen Daten mit print-Anweisungen angezeigt. Reale Server senden keine Texte an irgendeine Konsole, sie schreiben wichtige Ereignisse in eine Log-Datei.

Profi-Server

Ein Praxis-taugliches Server-Programm soll die gewünschte Leistung möglichst rasch für viele Clients erbringen.

Das Programm muss außerordentlich robust sein, damit es allen auftretenden Problemen gewachsen ist und insbesondere allfälligen Angriffen standhalten kann. Ein einiger von einem Angriff 'überlisteter' Server kann den gesamten Server-PC und das angeschlossene Netzwerk gefährden.

Reale Server-Programme sind daher um mehrere Größenordnungen umfangreicher als die einfachen, hier vorgestellten Beispiele.
Einige der zusätzlich notwendigen Maßnahmen:
Der Server-Prozess lässt sich (typisch durch ein Shell-Script im Linux-Verzeichnis /etc/init.d) starten, stoppen und restarten. Auf diese Weise wird er auch nach dem Hochfahren des Betriebssystems gestartet und vor dessen Shutdown angehalten.
Der Prozess startet normalerweise mit root-Privilegien, koppelt sich danach jedoch von seinem Start-Terminal ab und vesetzt sich selbst in den Hintergrund. Er läuft daher auch dann weiter, wenn das Start-Terminal beendet wird.
Beim Start liest der Server seine Konfigurations-Daten - typisch aus einer Text-Datei.im Linux-Verzeichnis /etc/*.conf
Für jeden Client-Auftrag wird ein eigener Child-Prozess erzeugt, der - isoliert und abgesichert - unabhängig vom Server selbst und allen anderen Child-Prozessen weiterläuft.
Die Handler für alle wichtigen oder potentiell gefährlichen Ereignisse (Signale) werden entweder neu formuliert oder abgeschaltet.
Die Prozesse wechseln in ein sicheres Verzeichnis und reduzieren ihre Privilegien auf ein Mindestmaß, bevor sie die eigentliche Arbeit aufnehmen.
Das Server-Programm schreibt seine Prozess-ID-Nr in eine Datei, (typisch /var/run/*.pid) damit er von anderen, dazu autorisierten Programmen gefunden und beendet werden kann.
Der Server schreibt laufende / wichtige Ereignisse in eine Log-Datei (typisch /var/log/*.log)