Network Services VU 2.0, Programmierbeispiel


SS 2006 - Johann Oberleitner - Letzte Änderung: Fri Jan 12 16:17:11 WEST 2007



Tasks

Jede Gruppe muss eine der unten angegebenen Aufgaben mit einem Standard-Protokoll implementieren. Die möglichen Protokolle beziehen sich entweder auf das Web, email, oder News.

Richtlinien

Die jeweilige Aufgabe muss entweder in Java oder C# implentiert werden (In Ausnahmefällen ist auch C++ möglich, macht die Lösung aber nicht unbedingt einfacher). Es dürfen ausser den eingebauten Socket-Standardbibliotheken keine weiteren Bibliotheken für den Netzwerkzugriff verwendet werden (das würde manche Aufgabenstellung zu einfach machen), dh. es dürfen zum Beispiel keine Klassen verwendet werden, die einen HttpServer implementieren. Das sollen Sie selbst machen.

Es muß kein Protokoll vollständig implementiert werden (das würde einige Aufgaben zu einer Diplomarbeit machen). Es soll aber jeweils soviel implementiert werden (Commandos und entsprechende gültige Responses), das mit existierenden Clients bzw. Server eine gültige Kommunikation in Standardfällen (die sicher 90% der Internetkommunikation abdecken) möglich ist. Standardanfragen und Standardfehler (zB. HTTP Request an fehlende Adresse bzw. EMail an ungültige Adresse geschickt) müssen auf jeden Fall unterstützt werden und die korrekten Antworten an den Client bzw. Server geschickt werden. Im Zweifelsfall implementieren Sie entsprechende Funktionalitäten. Wenn eine Teilfunktionalität extrem aufwendig erscheint (nicht in wenigen Stunden mit dem Übungskenntnissen aus Verteilte System zu implementieren), wird es wahrscheinlich nicht verlangt sein).

Alle Clients bzw. Server die Sie implementieren müssen Multithread-fähig sein! Dh. es darf keine essentielle Verzögerungen geben für das Durchführen einer Aktion. Ein Tutorial für Threads in Java gibt es hier.

Hinweis: neben den RFCs ist es auch hilfreich wenn Sie einmal die Kommunikation mit existierenden Programmen, dass die unten angeführten Aufgaben erledigen protokollieren, zB. mit TCP-Dump oder Ethereal. Dann können Sie auch einfach vergleichen, ob Ihre Kommunikationsdaten abweichen.

Für Logging von Nachrichten, Programmzunständen, etc. sind Frameworks wie log4j oder log4net nützlich, aber nicht Voraussetzung. Diese Frameworks erlauben das einschalten,wegschalten von Logeinträgen nach gewünschter Detailstufe.

Bedenken Sie, dass Sie nicht alleine in Ihrer Gruppe sind! Teilen Sie die Aufgabenstellung entsprechend auf. Es ist aber notwendig, dass sich jeder mit den einzelnen Teile die für die Abgabe notwendig sind auseinandergesetzt hat, insbesondere dem entsprechenden Protokollen und der Implementierung. Beim Abgabegespräch kann es Standard-Fragen zum Protokoll geben!

Das Programmierbeispiel soll beim 2. Abgabegespräch (Ende Juni) abgegeben werden. Es ist auch möglich das Programmier-Beispiel bis Ende Juli abzugeben.

Folgende Dinge müssen beim 2. Abgabegespräch mit abgegeben werden:

Artifact Beschreibung
Lauffähiger Binärcode Es soll das lauffähige Programm inklusiver aller DLLs, jar-Files, etc. abgegeben werden.
Kommentierter Sourcecode Der Quelltext des vollständigen Programms muss abgegeben werden. Es müssen alle Methoden dokumentiert sein.
Unit-Tests Es müssen Unit-Tests mit abgegeben werden. Für Java sollten Sie JUnit verwenden, für C# NUnit. Eine Einführung in JUnit (auch für NUnit anwendbar) gibt es unter Test Infected. Schreiben Sie für jeden Anwendungsfall einen eigenen Test (zB. simple Mail versenden, Mail mit Attachment versenden, ...). Alle Ausführungspfade Ihres Programms müssen durch mindestens einen Test ausgeführt werden (inklusive aller gefangenen Exceptions). Sie dürfen in Ihren JUnit beliebige Klassen bzw. Bibliotheken verwenden, soferne Sie die entsprechenden Dateien mitliefern können (ohne Verstöße gegen diverse Lizenzen begehen) - Sie müssen aber keine externen Bibliotheken verwenden.
Dokumentation Es muß eine Dokumentation zum Design bzw. zum Protokoll angefertigt werden. Diese Dokumentation soll ca. 4-6 Seiten im 2-spaltigen IEEE Society Format haben. Beschreibungen wie dieses Format genau aussieht bzw. Formatvorlagen gibt es für Latex und für Microsoft Word. Für andere Formate müssen Sie die Formatierung selbst vornehmen. Es sollte in jedem Fall ungefähr so aussehen wie in beschrieben. Ich empfehle Ihnen Latex zu verwenden. Das ist vermutlich am einfachsten zu editieren weil es nur auf Textdateien basiert (die Datei latex8.tex enthält ein Beispiel, übersetzen kann man es auf der Commandline mit latex latex8). Idealerweise geben Sie eine PDF Datei ab, zur Not geht Word auch. Andere Formate sind nicht möglich (und müssen daher entsprechend konvertiert werden). Die Doku muss auf jeden Fall die Kapitel Einleitung, Protokoll, Design, Implementierung, und Zusammenfassung enthalten sowie Referenzen enthalten. Sie kann in Deutsch oder in Englisch angefertigt werden.

Aufgaben

Aufgabe Beschreibung
SMTP Server Es soll ein einfacher SMTP Server implementiert werden. Sie sollten sich weitgehend an RFC 2821 (SMTP) halten. Es müssen auf jeden Fall die SMTP Commandos EHLO,MAIL,RCPT,DATA,RESET,HELP,QUIT unterstützt werden. Achten Sie darauf, dass die Emails, die Sie versenden dem Format in RFC 822/2822 (Internet Message Format) folgen. Das Versenden von Dateien via MIME-Attachments (RFC 2387) soll ebenfalls möglich sein. Es muss nicht der vollständige MIME Standard umgesetzt werden, aber das Versenden von Textmails und das Versenden von Attachments mit beliebigen Binärfiles soll möglich sein. Die EMail-Dateien sollen in verschiedenen Verzeichnissen gespeichert werden (abhängig vom Empfänger). Relaying (Weiterleiten von SMTP Nachrichten, falls der Server nicht der Endpunkt einer EMail Kommunikation ist) soll ebenfalls unterstützt werden. Hierbei sollen entsprechende Zielnetzwerke parametrisiert werden können, für die relaying erlaubt ist. Logfiles die den Mailverkehr aufzeichnen, sollen angelegt werden. Zum Testen verwenden Sie einen herkömmlichen EMail-Client bzw. am Anfang wird Telnet ausreichen.
EMail Client Es soll ein einfacher EMail Client implementiert werden. Dabei muss SMTP (RFC 2821) für das Versenden von Email unterstützt werden. Für das Empfangen von EMails soll entweder POP3 oder IMAPv4 unterstützt werden. Es muss jeweils nur die Menge an Funktionalität implementiert werden, die benötigt wird, um EMails zu Versenden bzw. zu Empfangen. Diese EMails sollen dem Format in RFC 822/2822 folgen. Das Versenden bzw. Empfangen von MIME-Attachments (RFC 2387) soll ebenfalls möglich sein. Zum Testen können Sie die Einstellungen einer Ihrer email-Adressen verwenden (SMTP-Server bzw. POP3 / IMAPv4 Server). Sie können die Oberfläche des Clients sowohl textbasiert als auch graphisch gestalten, aber die Funktionalität soll erreichbar sein.
POP3/IMAP4 Server Schreiben Sie einen kombinierten POP3/IMAP4 Server, der das Abholen bzw. Löschen von EMails erlaubt. Dabei sollen für POP3 die Kommandos USER,PASS,STAT,LIST,RETR,DELE,NOOP,RSET,QUIT implementiert werden. Für IMAP4 (RFC 2060) sollen all jene Kommandos implementiert werden, die benötigt werden um EMail Folder inklusive EMails zu verwalten (SELECT,CREATE,DELETE,SEARCH,FETCH,...). Kommandos, die für eine Anmeldung notwendig sind, müssen Sie ebenfalls implementiertn. Es müssen keinerlei Kommandos für Mailbox subscription implementiert werden (zum Beispiel SUBSCRIBE,LSUB). Die EMails sollen jeweils aus einem Verzeichnis gelesen werden können. Log-Files sollen die entsprechenden Commandos mitloggen. Als Beispiele wie das Format von den Dateien aussieht, können Sie EMail Verzeichnisse verwenden, die Sie zum Beispiel aus der Lab-Umgebung kopieren können (aber auch von beliebigen anderen Accounts, das Format ist meistens identisch). Zum Testen können Sie herkömmliche EMail Clients verwenden. Bzw. für das initiale Testen wird auch Telnet funktionieren.
DNS Server Schreiben Sie einen DNS Server, der die Informationen für eine oder mehrere IPv4 Zone verwalten kann (als Authority). Es sollen dabei die Resource Entries: SOA,NS,A,PTR,TXT,CNAME unterstützt werden. Standard-Zonenfiles sollen dabei beim Starten des DNS Server geladen werden können, wobei Einträge die nicht unterstützt werden ignoriert werden sollen. Entsprechende Timeouts sollen bei den Requests entsprechend zurückgeliefert werden. Log-Einträge sollen entsprechend bei allen Requests bzw. beim Parsen des Zonenfiles angelegt werden.
HTTP Server Schreiben Sie einen HTTP Server, der HTTP 1.0 und HTTP 1.1 Requests unterstützt. Es sollen sowohl HTTP GET und POST Requests unterstützt werden. HTML Formulare sollen auch unterstützt werden. Es sollen dabei entweder CGI Scripts unterstützt werden (dann aber in beliebigen Implementierungssprachen) oder wenn Sie Java verwenden können Sie alternativ die Ausführung von Java Servlets unterstützen. Das heisst Sie müssen eine einfache Servlet Umgegung schreiben (die Betonung liegt auf einfach). Zusätzlich soll auch die Sicherung eines Bereichs von Dateien über HTTP Basic-Authentication unterstützt werden. Sie können sich dabei selbst überlegen wie Sie den entsprechenden Bereich festlegen können. Log-Einträge sollen entsprechend bei allen Requests angelegt werden. Testen können Sie Ihren Server mit einem Standard-Browser.