BUGH Wuppertal Fachbereich 7 - Mathematik Axel Rogat
Betriebssysteme und betriebssystemnahes Programmieren
Übungsblatt 8

Aufgabe 17
Schreiben Sie ein C++-Programm showhttp, das ein beliebiges Dokument aus dem Internet lädt und ausgibt.

  • Sie sollen die Daten natürlich roh übernehmen und auf die Standard-Ausgabe kopieren (bitte keinen WWW-Browser schreiben)! Bilddaten könnten so aber z.B. per Pipeline an "xv" weitergegeben und angezeigt werden, beispielsweise:
    showhttp www.math.uni-wuppertal.de/~axel/im/axllogo.gif | xv -
  • Als einzigen Aufrufparameter erhält das Programm die HTTP-Adresse des Dokuments, im Format "host/doc" oder "host:port/doc". Wenn die Port-Angabe fehlt, soll der HTTP-Standardport 80 verwendet werden.

  • Sie können große Teile des Programms vom Client sclient aus der Vorlesung übernehmen. Erfragen Sie mit gethostbyname die Adresse des Rechners und füllen Sie damit und mit dem Port eine Adreßstruktur. Legen Sie einen Client-Socket an und stellen Sie mit connect die Verbindung her.

  • Das HTTP-Kommando zum Anfordern eines Dokuments ist "GET /doc". Schicken Sie es einfach per send über Ihren Socket an den Server. Lesen Sie danach so lange Daten aus dem Socket, wie noch welche geliefert werden, und kopieren Sie sie auf die Standard-Ausgabe.

    ("Echte" Browser-Anfragen enthalten hinter dem GET diverse Protokoll-Angaben, die Sie hier nicht zu imitieren brauchen!)

  • Melden Sie das Zustandekommen der Verbindung, und geben Sie die numerische Adresse des Servers aus (mit dem Operator aus der Vorlesung) - beides natürlich auf den Fehlerkanal!

Aufgabe 18
Schreiben Sie einen einfachen WWW-Server myhttpd, der auf HTTP-Anfragen hin Dokumente an Clients liefert.

  • Sie brauchen keine Spezialfähigkeiten einzubauen (wie CGI-Skripte ausführen o.ä.)! Der Server soll lediglich seinen Port abhören und, wenn ein GET-Kommando (siehe Aufgabe 17) ankommt, das angegebene Dokument zurückschicken.

  • Als einziger Aufrufparameter soll die Port-Nummer angegeben werden können, also beispielsweise "myhttpd 8080" (der übliche Port 80 kann nur mit root-Rechten verwendet werden, falls er nicht ohnehin schon für einen "echten" Server vergeben ist). Sie können also (z.B. zum Testen) mit Ihrem Programm showhttp aus Aufgabe 17 kommunizieren, wenn beide dieselbe Portnummer verwenden.

  • Verfahren Sie ähnlich wie der Server sserver aus der Vorlesung. Legen Sie also einen Listen-Socket an, binden Sie ihn mit bind an den gewünschten Port und initialisieren Sie mit listen die Warteschlange für Anfragen.

    Nehmen Sie danach in einer Endlosschleife Anfragen per accept an. Lesen Sie dann jeweils aus dem Accept-Socket ein Kommando, bearbeiten es, wenn es ein "GET" ist (sonst liefern Sie eine Fehlermeldung, s.u.), und schließen Sie den Accept-Socket. Sie brauchen für die Bearbeitung der Anfrage keinen neuen Prozeß zu erzeugen.

    Geben Sie zur Kontrolle jeweils die Adresse des Clients und das angekommene Kommando (ohne die Steuerangaben) aus!

  • Beachten Sie, daß hinter dem "GET" nach einem Space der Dokumentname folgt. Nach einen weiteren Space können allerdings noch diverse Steuerangaben folgen, die Sie einfach ignorieren sollen!

    Wenn Sie wollen, können Sie in den Steuerangaben nach einer Zeile suchen, die mit "User-Agent:" beginnt - dahinter findet sich beispielsweise der Name des Browsers, der bei Ihnen anfragt.

  • Bei Fehlern wird normalerweise ein HTTP-Fehlerstatus zurückgegeben. Sie brauchen sich natürlich nicht an das genaue Protokoll zu halten. Geben Sie aber zur Orientierung zumindest folgende Fehlernummern und Fehlermeldungen im Klartext zurück:
    "400 Bad Request" (fehlendes/falsch formatiertes Argument),
    "403 Forbidden" (keine Leserechte auf das Dokument),
    "404 Not Found" (Dokument existiert nicht),
    "501 Method Not Implemented" (unbekanntes Kommando, hier: kein GET).
    Wenn Sie wissen wollen, was "echte" Server zurückliefern, können Sie das ja jederzeit mit Ihrem showhttp testen.

  • Die übliche Konvention, wo Dokumente anhand ihres Pfades gesucht werden, ist folgende:

    Dokumente, deren Pfad mit `~' beginnt, liegen im public_html-Verzeichnis eines Benutzers, ansonsten in einem Standardverzeichnis wie "/usr/local/httpd/htdocs". Beginnt der Pfad beispielsweise mit "~axel/", wechseln Sie nach "/home/axel/public_html".

    Der Rest des Pfads wird wie ein normaler Pfad aus Directories interpretiert. Wenn ein ".." vorkommen sollte, lehnen Sie aus Sicherheitsgründen die Lieferung ab (da man sonst an beliebige Stellen im Dateibaum gelangen könnte)!

    Falls der Pfad auf ein `/' endet, liefern Sie die Datei "index.html" aus dem entsprechenden Verzeichnis. Wenn ansonsten der Pfad kein File, sondern ein Directory beschreibt, liefern Sie am besten einen Fehler zurück, da sonst Browser bei nachfolgenden relativenu Pfadangaben Fehler machen. (Der HTTP-Status wäre "301 Moved Permanently").

    Als Beispiel folgen einige HTTP- und die korrespondierenden Directory-Pfadangaben mit den oben angenommenen Verzeichnis-Namen:

    /~axel/im/axllogo.gif /home/axel/public_html/im/axllogo.gif
    /~axel/ /home/axel/public_html/index.html
    /~axel "301 Moved Permanently"
    / /usr/local/httpd/htdocs/index.html

 
email: axel@math.uni-wuppertal.de Zurück Abgabe: 25.6.1999
 

© 1999 Axel Rogat