Thomas: Modem simulation

Hi,

ich hab ein Problem mit dem Slowie Script:

http://www.linux-magazin.de/Artikel/ausgabe/2001/05/perl/perl.html

Hier könnt ihr euch denn Quellcode anschauen...

Nun hab ich ein Problem, wenn ich eine Seite mit Frames laden lasse, bricht er immer zu früh ab.

Wenn ich das exit(0) entferne, hab ich leider duzende Zombies...
und des Teil läuft auch weiter (was auch erwünscht ist).

Nun zur Frage
Was muss ich ändern, damit das Script
a, ständig läuft
b, und wenn die Seite vollständig aufgebaut ist keine
   Kindprozesse mehr laufen

Weiß jemand Rat?

Gruß aus Franken
Thomas

  1. Halihallo Thomas

    Nun hab ich ein Problem, wenn ich eine Seite mit Frames laden lasse, bricht er immer zu früh ab.

    Was heisst das, wieweit lädt er denn?

    Wenn ich das exit(0) entferne, hab ich leider duzende Zombies...

    Du arbeitest mit Unix-Derivat?

    Das exit(0) lass mal lieber stehen, sonst hast du bald 100 listende Server-Prozesse,
    der fork startet aber einen Client-Prozess, den du "abwürgen" musst, wenn er die Arbeit
    erledigt hat.

    Was muss ich ändern, damit das Script
    a, ständig läuft

    das tut es bereits. Wie folgerst du, dass es das nicht tut?

    b, und wenn die Seite vollständig aufgebaut ist keine
       Kindprozesse mehr laufen

    lass das exit(0) stehen!

    Viele Grüsse

    Philipp

    1. Hi Phillip,

      wenn ich das Script im orginal Zustand lasse lädt er immer nur einen Teil, (siehe unten). Erst wenn ich das exit(0) entferne, lädt es die Seiten komplett (dann aber mit Zombies ("x" - Client-Prozesse)..

      Halihallo Thomas

      Nun hab ich ein Problem, wenn ich eine Seite mit Frames laden lasse, bricht er immer zu früh ab.

      Was heisst das, wieweit lädt er denn?

      Er unterschiedlich weit...
      mal lädt er alle Texte, aber keine Bilder,
      und mal nur ein Frame komplett

      Wenn ich das exit(0) entferne, hab ich leider duzende Zombies...

      Du arbeitest mit Unix-Derivat?

      Linux Suse 8.1

      Das exit(0) lass mal lieber stehen, sonst hast du bald 100 listende Server-Prozesse,
      der fork startet aber einen Client-Prozess, den du "abwürgen" musst, wenn er die Arbeit
      erledigt hat.

      Was muss ich ändern, damit das Script
      a, ständig läuft

      das tut es bereits. Wie folgerst du, dass es das nicht tut?

      Es beendet sich nachdem es eine Seite zum Teil geladen hat..
      (Ist bei den Prozessen auch nicht mehr vorhanden)

      b, und wenn die Seite vollständig aufgebaut ist keine
         Kindprozesse mehr laufen

      lass das exit(0) stehen!

      Viele Grüsse

      Philipp

      1. Halihallo Thomas

        wenn ich das Script im orginal Zustand lasse lädt er immer nur einen Teil, (siehe unten). Erst wenn ich das exit(0) entferne, lädt es die Seiten komplett (dann aber mit Zombies ("x" - Client-Prozesse)..

        Was folgerst du daraus? - Hm, ich nehme es vorweg: Die Connection wird nicht geschlossen,
        da dein Browser einen HTTP/1.1 Request mit Connection: keep-alive sendet. Nun, das
        verlinkte Script versteht kein HTTP/1.1 (nicht im geringsten :-)) und wartet somit immer
        noch, bis der Server (nach HTTP/1.0) die Response beendet (was eben nie geschieht).
        Du musst im Client-Request den HTTP-Header "Connection: keep-alive" durch
        "Connection: close" ersetzen, sodass wenn der Client-Prozess (das ist das, nach dem
        fork() und next;) nicht unendlich lange wartet, sondern nach dem Empfang der Antwort
        vom entfernten Server abbricht und der Prozess verschwinden kann.
        Äm, anders rum: Bei Connection: close wird der entfernte Server die Verbindung sofort
        beenden, nachdem er die Daten empfangen hat und dein Programm kann das auch feststellen
        und bricht dann ab.

        Nun hab ich ein Problem, wenn ich eine Seite mit Frames laden lasse, bricht er immer zu früh ab.

        Was heisst das, wieweit lädt er denn?

        Er unterschiedlich weit...
        mal lädt er alle Texte, aber keine Bilder,
        und mal nur ein Frame komplett

        ??? - Folgt keiner Logik, die durch das Programm zu reproduzieren wäre, IMHO.

        das tut es bereits. Wie folgerst du, dass es das nicht tut?
        Es beendet sich nachdem es eine Seite zum Teil geladen hat..
        (Ist bei den Prozessen auch nicht mehr vorhanden)

        Was ist in der Prozessliste nicht mehr vorhanden? - Ein Prozess bleibt immer bestehen,
        das ist der Server-Prozess, dass die Clients verschinden bei deiner momentanen Umsetzung
        nur dadurch zu erklären, dass der entfernte Server HTTP/1.1 ebenfalls nicht versteht.

        ---

        Nun, versuch die Schritte des Programmes zu verstehen. Dies kannst du, indem du eine
        Log-datei definierst, wo du die Server-Requests/Responses genau protokollierst und
        die jeweilig weitergeleiteten Nachrichten des Programmes. Das wird evtl. schon einige
        Fragen beantworten, wenn nicht, schau nochmal hier herein :-)

        Viele Grüsse

        Philipp

        1. Hallo Philipp,

          erstmal danke für deine sehr ausführliche Antwort.

          Trotzdessen, dass dein Antwort sehr ausführlich ist, weiß ich leider immer noch nicht was ich da zu ändern hab... ;o) ;o)

          Ich nehme mal an aus meiner Fragerei erübrigt es sich zu sagen, das ich nie was mit Perl zu tun hatte (Linux im übrigen auch nicht)!!!

          Muss ich jetzt Änderungen am Server, Script o. Client vornehmen?
          Ich hab jetzt einfach mal die Einstellunge des Browsers (... 1.1) wieder rausgenommen, dies bring leider auch nichts.

          Woher weißt du eigentlich das dieses Script kein Http: 1.1 erlaubt??
          Entnimmst du das den Quellcode?

          Danke für deine geopferte Zeit

          Gruß
          Thomas

          1. Halihallo Thomas

            Trotzdessen, dass dein Antwort sehr ausführlich ist, weiß ich leider immer noch nicht was ich da zu ändern hab... ;o) ;o)

            schäm dich :-))  Nicht ernst gemeint.

            Ich nehme mal an aus meiner Fragerei erübrigt es sich zu sagen, das ich nie was mit Perl zu tun hatte (Linux im übrigen auch nicht)!!!

            Hm. Lerne es doch, es lohnt sich :-)

            Muss ich jetzt Änderungen am Server, Script o. Client vornehmen?

            Ja und ich muss gestehen, ich weiss nicht was, da ich weder das Script kenne, noch
            das Problem wirklich durchschaut habe.

            Ich hab jetzt einfach mal die Einstellunge des Browsers (... 1.1) wieder rausgenommen, dies bring leider auch nichts.

            Tja, dann erübrigt sich meine Vermutung (wahrscheinlich) :-(

            Woher weißt du eigentlich das dieses Script kein Http: 1.1 erlaubt??
            Entnimmst du das den Quellcode?

            Ja. Es sei denn... ein Moment bitte...
            aus perldoc LWP:
            "The libwww-perl HTTP implementation currently support the HTTP/1.1 and HTTP/1.0 protocol."

            auch keep-alive ist auch drinn... Schande über mein Haupt!

            Viele Grüsse

            Philipp

            1. Gebs zu... du hast nur keine Lust mehr ;o) *ig* *ig*

              Tortzdem danke, dafür das du es zumindest versucht hast!

              1. Halihallo Thomas

                Gebs zu... du hast nur keine Lust mehr ;o) *ig* *ig*

                Ich bin leider auch nicht allwissend, ich sehe den Fehler wirklich nicht, das ist keine
                Ausrede sondern Realität (shame on me!).

                Nun, vielleicht fällt mir ja noch etwas ein/auf, sodass du mich nicht mehr der
                Unlust beschuldigst :-)

                Viele Grüsse

                Philipp

        2. Halihallo Philipp

          Was folgerst du daraus? - Hm, ich nehme es vorweg: Die Connection wird nicht geschlossen,
          da dein Browser einen HTTP/1.1 Request mit Connection: keep-alive sendet. Nun, das
          verlinkte Script versteht kein HTTP/1.1 (nicht im geringsten :-)) und wartet somit immer
          noch, bis der Server (nach HTTP/1.0) die Response beendet (was eben nie geschieht).
          Du musst im Client-Request den HTTP-Header "Connection: keep-alive" durch
          "Connection: close" ersetzen, sodass wenn der Client-Prozess (das ist das, nach dem
          fork() und next;) nicht unendlich lange wartet, sondern nach dem Empfang der Antwort
          vom entfernten Server abbricht und der Prozess verschwinden kann.
          Äm, anders rum: Bei Connection: close wird der entfernte Server die Verbindung sofort
          beenden, nachdem er die Daten empfangen hat und dein Programm kann das auch feststellen
          und bricht dann ab.

          Auch wenn es niemanden mehr interessiert, aber das war eine falsche Schlussfolgerung.
          Nach genauem hinsehen und Lektüre der betreffenden Module ist mir aufgefallen, dass
          auch eine keep-alive Verbindung mit dem verlinkten "Proxi" möglich ist.

          Ansonsten, Thomas, habe ich leider nichts konstruktives mehr anzubringen :-(

          Viele Grüsse

          Philipp