|
Schreiben Sie in C++ Server und Client zu einem einfachen
Internet-Chat.
-
Beliebig viele Benutzer auf verschiedenen Rechnern sollen sich
über Ihren Server miteinander unterhalten können. Alle geben jeweils
eine Zeile in ihrem Client ein, der sie unverändert an den Server schickt.
Der Server wiederum stellt der Zeile das Pseudonym (den
"Nickname") des Redenden voran und verschickt das Ergebnis an alle
angeschlossenen Clients, also etwa "AXL: hallo!".
-
Der Server erhält als Aufrufparameter den zu verwendenden Port; der Client
erhält den Rechnernamen des Servers, den Port und den zu verwendenden
Nickname, z.B.:
chatserver 4711
chatclient wman4 4711 AXL
-
Der Client soll einfach in einem normalen xterm-Fenster betrieben
werden. Die unterste Zeile wird für die Eingabe verwendet, in den Zeilen
darüber scrollen die ankommenden Nachrichten nach oben (s.u.).
-
Zwei spezielle Eingabezeilen sind in den Clients definiert.
"/names" gibt eine Liste aller momentan angeschlossenen Teilnehmer
aus, etwa im Stil
"AXL von 132.195.7.49 (wman4.math.uni-wuppertal.de)".
Die Zeile "/bye" beendet den Client (er soll auch
sicher mit CTRL-C abgebrochen werden können).
-
Wenn ein neuer Teilnehmer angeschlossen wird, soll der Server die Nachricht
"nickname kommt herein" an alle Clients schicken. Wenn sich
ein Teilnehmer abkoppelt, soll
"nickname verläßt uns"
verschickt werden.
Hinweise:
Server: Es werden viele unterschiedliche
Prozeßkommunikations-Mechanismen benötigt. Bitte gehen Sie genau so
vor, wie hier beschrieben wird.
Client: Der Client ist relativ einfach:
-
Das erste, was der Client dem Server schickt, ist der Nickname des neuen
Teilnehmers.
-
Danach soll sich auch der Client mit fork in zwei Prozesse aufspalten
- einen zur Annahme der Eingaben des Benutzers, einen zum
Empfangen der Nachrichten vom Server.
-
Wenn der Client mit CTRL-C beendet wird, soll er dem Server die
Nachricht "/bye" schicken, damit dieser den Teilnehmer austragen
und verabschieden kann.
Kleinere Probleme ergeben sich
lediglich bei der Terminal-Steuerung. Zum ersten Testen geben Sie die
Nachrichten einfach auf den Fehlerkanal aus und arbeiten mit Ihrem
Skript log aus Aufgabe 15! Gehen Sie danach vor wie hier beschrieben:
-
Die Eingabe soll immer in der untersten Zeile erfolgen, die Ausgaben
darüber. Sie können dazu einen beliebigen Terminal-Steuermechanismus
verwenden (curses, ANSI-Steuersequenzen). Einfache Routinen mit
xterm-Sequenzen liegen auf der Homepage bereit
(xterm_seq.cpp und
xterm_seq.h).
-
Beachten Sie dabei, daß Sie zwar zwei Prozesse, aber nur ein Terminal
zur Verfügung haben (und insbesondere nur eine Cursor-Position).
Wenn die Eingabe einer neuen Nachricht durch
das Anzeigen von Server-Meldungen unterbrochen wird, muß die Eingabezeile
danach restauriert werden.
Gehen Sie wie folgt vor: Verwenden Sie einen binären Semaphor, um
sicherzustellen, daß nur ein Prozeß gleichzeitig auf das Terminal
schreibt. Wenn eine Server-Nachricht dargestellt wurde (die Eingabezeile
wird zerstört), soll dieser Prozeß dem anderen
ein SIGUSR1 schicken. Der andere stellt daraufhin die Eingabezeile
neu dar. Damit das möglich ist, können Sie kein normales gets
o.ä. verwenden, sondern müssen die Zeichen einzeln annehmen, Backspace
behandeln, etc. Die Routine xterm_readline erledigt das für Sie.
Viel Erfolg!
|