Schrift
Wiki:Tipp zum Debugging: use Data::Dumper; local $Data::Dumper::Useqq = 1; print Dumper \@var;
[thread]12562[/thread]

Einlesen aus (my $buffer = <$client>) klappt nicht

Leser: 1


<< >> 5 Einträge, 1 Seite
Hagen
 2008-09-30 16:07
#115026 #115026
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Hallo,

ich 'probiere' mich gerade an einem kleinen Perl-Server einfach um das mal auzuprobieren. Allerdings komme ich an einer Stelle nicht weiter und ich verstehe nicht warum bzw. was da genau abläuft:
Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
        my $socket = new IO::Socket::INET (
                LocalPort => $listen_port,
                Listen => 999,
                ReuseAddr => 1,
                Proto => "tcp",
                )
                || die "can't create local socket: $@\n";
        

        while(my $client = $socket->accept()) {
                        while(my $buffer = <$client>) { ...

Hier bleiben ich immer hänge, d.h. ich springe aus der Schleife nicht mehr heraus.
Folgendes habe ich auch ausprobiert (vor die Schleife gesetzt), habe aber dann keine Ausgabe erhalten:
Code (perl): (dl )
foreach my $item (<$client>) { print $item; }

Ich springe einfach nicht über diese Zeile hinweg, als ob noch auf etwas gewartet wird.

Hat vielleicht einer einen Tipp für mich?
Gruß
Hagen
ich
 2008-09-30 19:09
#115037 #115037
User since
2003-09-19
120 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hiho,

Code: (dl )
while(my $client = $socket->accept()) {


diese Zeile wartet bis eine Verbindung auf Port 999 reinkommt.

Starte mal das Script und mach ein telnet auf diesen Port.

Code: (dl )
telnet localhost 999


und schreib da dann ein paar zeilen rein.

Gruss
jan
If you tell the truth you don't have to remember anything.
-- Mark Twain
Hagen
 2008-10-02 17:37
#115111 #115111
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Warum auf Port 999?
Code (perl): (dl )
LocalPort => $listen_port

gibt doch den Port an, oder?

(Hinweis: ich greife per Browser auf das Skript zu)

Ich vermute, dass es an dem
Code (perl): (dl )
my $buffer = <$client>

liegt. Kann mir vielleicht jemand erklären, was die Zeile genau macht?

Wenn ich nur $client ausgeben bekomme ich als Ergebnis "IO::Socket::INET=GLOB(0x2aa9c54)", wenn ich <$client> hängt er irgendwann wieder in dieser Zeile. Eine Idee wäre, dass auf ein \n gewartet wird oder irgendetwas gepuffert wird. Aber '$| = 1;' hilft mir auch nicht weiter :-(
Gruß
Hagen
Gast Gast
 2008-10-02 17:58
#115112 #115112
"$client" wird hier als Filehandle benutzt. Was auch funktioniert, da IO::Socket::INET IO::Socket nutzt, das wiederum IO::Handle nutzt.

Code (perl): (dl )
my $buffer = <$client>

Das liest eine "Zeile" (was eine Zeile ist wird in "$/" definiert, voreingestellt ist "\n")
Du musst also Daten auf den Port schicken, die werden dann verarbeitet.
Die WhileSchleife bricht erst bei einem "EOF", wenn also das Lesen vom Filehandle "false" ergibt.
Das passiert, meine ich, wenn du die Verbindung zum Script auf dem entsprechenden Port schließt.
Hagen
 2008-10-23 16:50
#115723 #115723
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Die Lösung nach viel Sucherei endlich gefunden. Wenn Daten vom Browser per POST übergeben werden, dann darf nach der Leerzeile nur noch wie folgt weiter gelesen werden:
Code: (dl )
read($client, $daten, $Content_Length)

Scheint ein recht "häufiges" Problem zu sein, jedenfalls habe ich viele Fragen dazu gefunden, aber bisher nur eine Lösung (und dann in einem Script) gefunden.
Gruß
Hagen
<< >> 5 Einträge, 1 Seite



View all threads created 2008-09-30 16:07.