Modem simulation
Thomas
- perl
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
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
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äuftdas 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 laufenlass das exit(0) stehen!
Viele Grüsse
Philipp
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
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
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
Gebs zu... du hast nur keine Lust mehr ;o) *ig* *ig*
Tortzdem danke, dafür das du es zumindest versucht hast!
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
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