Hoi,
Allerdings gibts nun ein Problem:
Wenn ich mit Telnet den Server blockiere kann ich nicht mehr mit
einem anderen Programm drauf zugreifen. Es müßte doch aber möglich
sein, das der einer eingehenden Verbindung eine Subroutine
zuweist, und dann weiter auf eingehende Verbindungen wartet,
während der andere Client abgefertigt wird.
Kennt sich da jemand aus?
Dazu gibt es mehrere Ansaetze. Der erste und einfachste ist der
folgende: du forkst mit jeder Verbindung einen neuen Prozess auf. Das
Child beendet sich dann nach einer abgeschlossenen Session und der
Vater-Prozess horcht weiter auf dem Listener-Socket. Das ist allerdings
keine optimale Loesung: fuer jeden Verbindungs-Request muss eine
Prozess-Kopie erstellt werden, was unter Umstaenden sehr lange dauern
kann. Und wenn viele Anfragen gleichzeitig kommen, dann kann es auch
durchaus sein, dass dein Server in die Knie geht, weil zu viele
Prozesse laufen. Ausserdem koennen verschiedene Childs nur sehr
schwer miteinander kommunizieren.
Die zweite Moeglichkeit ist multiplexing I/O. Das ist relativ
kompliziert zu handhaben, aber letztenendes laeuft es darauf hinaus,
dass man einen array of sockets hat, die in der Haupt-Schleife
jedesmal durchlaufen werden und denen bei jedem Schleifendurchlauf
ein Teil eines Buffers gesendet wird. Die Sockets werden vorher
mittels 'fcntl()' in den nonblocking Modus gesetzt, so dass sie
bei Lese- oder Schreibzugriffen nicht blockieren.
Die Methode hat jedoch mehrere Nachteile: sie ist kompliziert zu
implementieren und zu handhaben, und man muss aufpassen, dass man
keinen buffer overflow fabriziert. Dafuer ist sie jedoch, bei
vernuenftiger Programmierung, optimal schnell.
Die dritte Moeglichkeit ist ein threaded server. Threads sind IMHO
eine Weiterentwicklung von 'fork()' und ein threaded server ist
ein logischer Konsens aus fork()-Servern und multiplexing I/O.
Bei einem threaded server wird fuer jede Verbindung ein neuer
Thread aufgemacht. Ein threaded program kann mehrere Dinge scheinbar
parallel ausfuehren (auf Multi-Prozessor-Systemen *geht* das) und
arbeitet asynchron, es verhaelt sich also wie zwei fork()-Prozesse.
Aber die verschiedenen Threads benutzen alle denselben
Speicherbereich, so dass auch keine Kopie angefertigt werden muss,
und auch keine neuen Prozesse erstellt werden muessen. Wenn du mehr
ueber Threads erfahren willst, kann ich dir nur 'Programming with
posix threads' empfehlen, aus der Addison Wesley Professional
Computing Series.
Wenn du mehr ueber Netzwerk-Programmierung lernen willst, kann ich
dir 'Programming UNIX Networks Vol. 1 und 2' von W. Richard Stevens
und 'TCP/IP Illustrated 1, 2, 3' empfehlen.
Gruesse,
CK