Maik Görgens: Server mit Perl

Hallo liebe Forumer,

der ein oder andere weiß vielleicht, das ich für die Schule einen Server in Perl programmieren muß/will.

Nun habe ich in einem Buch über Perl-Module folgendes Server-Script gefunden:
###################################################################
use IO::Socket;
$server_sock = new IO::Socket::INET (
                    LocalPort => 2345,
                    Listen    => $SOMAXCONN,
                    Proto     => 'tcp',
             Reuse     => 1);
unless ($server_sock) { die "Could not create server socket; $!"; }
while ($sock_to_client = $server_sock->accept() )
 {
  ### hier ###
  $curr_time = localtime();
  print $sock_to_client "$curr_time $server_sock\n";
  $sock_to_client->close();
 }
close($server_sock);
print "Server going down\n";
###################################################################

Nun müßte es meinem Server aber möglich sein bei folgendem Aufruf über einem herkömmlichen Browser

'http://127.0.0.1:2345/html/texte/index.html'

den Teil '/html/texte/index.html' in einer Variablen zu speichern.
Wißt ihr, wie ich an diesen String herankomme?

wenn ich schonmal an den HTTP-Request in der Form

GET /html/texte/index.html HTTP/1.0
Connection: Keep-Alive
User-Agent: Mozilla/3.0Gold (WinNT; I)
Host: 127.0.0.1
Accept: */*

würde mir das schon reichen, der Rest ist ja nicht mehr schwer.

Ich nehme das die entsprechenden Erweiterungen an der Stelle, die ich mit ### hier ### gekennzeichnet habe erfolgen müssen.

Vielen Dank
    Maik Görgens

  1. Hallo,

    der ein oder andere weiß vielleicht, das ich für die Schule einen Server in Perl programmieren muß/will.

    Ich will doch nur hoffen, daß Du Perl programmieren _willst_ und es nicht nur tust, weil Du _mußt_;-)

    while ($sock_to_client = $server_sock->accept() )
    {
      ### hier ###
      $curr_time = localtime();
      print $sock_to_client "$curr_time $server_sock\n";
      $sock_to_client->close();
    }
    close($server_sock);

    Wißt ihr, wie ich an diesen String herankomme?

    Du kannst $sock_to_client als Dateihandle betrachten, in den Du schreiben _und_ von dem Du lesen kannst.

    es funktioniert also auch
    $daten = <$sock_to_client>;

    Das Lesen und Schreiben muß allerdings in geordneten Bahnen erfolgen, also in Deinem Falle exakt nach dem HTTP-Protokoll, da beide Seiten der Verbindung genau wissen müssen, wann sie lesen und wann sie schreiben sollen.

    Ich nehme das die entsprechenden Erweiterungen an der Stelle, die ich mit ### hier ### gekennzeichnet habe erfolgen müssen.

    Ja. Du mußt so lange zeilenweise einlesen, bis Du eine Leerzeile empfängst. Dann ist der GET-Request fertig.
    Die eingelesenen Zeilen mußt Du dann analysieren, um zur gewünschten Information zu gelangen (hier also 'GET /html/texte/index.html HTTP/1.0')

    Dann kannst Du eine entsprechende Antwort senden, vergiß allerdings nicht, daß Du für das HTTP-Protokoll auch einen passenden Response Header zurücksenden mußt.

    Grüße
      Klaus

    1. Hallo,

      der ein oder andere weiß vielleicht, das ich für die Schule einen Server in Perl programmieren muß/will.
      Ich will doch nur hoffen, daß Du Perl programmieren _willst_ und es nicht nur tust, weil Du _mußt_;-)

      nein, es ginge sicher auch ohne, aber ich _will_

      Du kannst $sock_to_client als Dateihandle betrachten, in den Du schreiben _und_ von dem Du lesen kannst.
      es funktioniert also auch
      $daten = <$sock_to_client>;

      vielen dank, das hilft mir wirklich weiter!!!

      Dann kannst Du eine entsprechende Antwort senden, vergiß allerdings nicht, daß Du für das HTTP-Protokoll auch einen passenden Response Header zurücksenden mußt.

      ich habe mir mal die Bestimmungen (zumindest teilweise) angesehen und muß sagen, das das sehr komplex ist (hätt' ich mir auch so denken können). somit habe ich mich entschieden, mein eigenes Transfer-Protokoll zu erfinden, das nur auf die wesentlichsten dinge eingeht. es soll ja nicht verbreitet werden, sondern nur zu demonstrationszwecken in der schule dienen.

      Vielen Dank nochmal
         Maik Görgens

      1. Hi Mike,

        Dann kannst Du eine entsprechende Antwort senden, vergiß
        allerdings nicht, daß Du für das HTTP-Protokoll auch einen
        passenden Response Header zurücksenden mußt.
        ich habe mir mal die Bestimmungen (zumindest teilweise) angesehen
        und muß sagen, das das sehr komplex ist (hätt' ich mir auch so
        denken können).

        Selbst beim Apache bin ich nicht sicher, ob er vollständiges HTTP/1.1
        spricht.
        Alle existierenden Browser sind weit davon entfernt, denke ich.

        somit habe ich mich entschieden, mein eigenes Transfer-Protokoll
        zu erfinden, das nur auf die wesentlichsten dinge eingeht.

        Das würde ich an Deiner Stelle nicht tun, sondern einen Subset von HTTP
        (1.0) verwenden.

        Schau Dir mal dieses Dokument an:
              http://www.w3.org/Protocols/HTTP/HTTP2.html

        Selbst HTTP 1.0 wäre für Deine Anforderungen sicher viel zuviel, da gebe
        ich Dir völlig recht. Und von den Methoden brauchst Du wahrscheinlich auch
        nur GET und sonst nichts. Damit würde schon mal ziemlich viel wegfallen.

        Bedenke, daß die Demonstration ja wohl am eindrucksvollsten abläuft, wenn
        Du dazu einen handelsüblichen Browser verwenden kannst.

        Viele Grüße
              Michael