Praktische Aufgabe 3: Chat

Unter Zuhilfenahme der Vorlage ist ein Chat bestehend aus Client und Server zu implementieren. Der Server nimmt Verbindung von beliebig vielen Clients entgegen. Clients senden Nachrichten zum Server, der diese an alle verbundenen Clients weiterleitet. Clients zeigen die vom Server empfangenen Nachrichten und ermöglichen die Eingabe von Nachrichten durch den Benutzer.

Bei der Erstellung der Programme sind folgende Punkte zu beachten:

  • Der Server muss parallel mehrere Verbindungen zu verschiedenen Clients bearbeiten können, hierbei sollte theoretisch keine Obergrenze bestehen. poll() wird verwendet, um bei eingehenden Daten benachrichtigt zu werden.
  • Die angemeldeten Clients sind über einen Nickname zu identifizieren und zu unterscheiden.
  • Anfragen von Clients können in mehrere Pakete fragmentiert sein. Es müssen demnach u. U. mehrfach Daten von der Verbindung gelesen werden. Dabei darf der Server natürlich nicht blockieren: Zwischen zwei Fragmenten werden Nachrichten anderer Clients bearbeitet Nachrichten sind begrenzt durch '\n'.
  • Die Kommunikation erfolgt über Sockets ohne Zuhilfenahme der cnaiapi. Die dazu erforderlichen Systemaufrufe werden in der Übung besprochen.
  • Der Server unterstützt zusätzlich folgende Kommandos (vgl. Vorlage):
    /nick MyNickname eignenen Nickname ändern
    /list Liste angemeldeter Benutzer ausgeben
    /msg User3 Dies ist eine private Nachricht an User3! private Nachricht senden
  • Der Client löst Rechnernamen mit Hilfe von getaddrinfo() auf.