[Dresden-pm] Massives Problem mit IO::Socket und HTTP

Mike Reiche su-root at web.de
Don Mar 11 18:32:44 CST 2004


Hallo Mailingliste,

ich hab vor ein paar Tagen einen Chat-Server geschrieben, der HTTP-Anfragen 
vom Browser annimmt und den Chat in einem Stream darstellt.

Soweit so gut, aber seit heute morgen funktioniert exakt der gleiche Code 
nicht mehr, auch ältere (zwischengespeicherte) Versionen geben einfach keinen 
Mucks mehr von sich.

Das Besondere: Netzintern funktioniert alles wunderbar, nur übers Internet 
fehlt die Funktionalität ganz.

Details:
Der Chat-Server nimmt die Syn-Anfrage des Browser entgegen und erstellt anhand 
des Sockets ein Objekt. Dieses Objekt empfängt nach Erstellung mittels 
$objekt->{socket}->recv($buffer,1000); den HTTP-GET Header den ich auslesen 
möchte.

Das Problem:
Der Header ist leer, die recv-Funktion wartet ewig und empfängt einfach nichts 
vom Browser - jedenfalls nur von Browsern aus dem Internet.
Somit kann Benutzername und Passwort nicht aus http://
hostname:1234/?cmd=connect&username=... (etc) ausgelesen werden und der Chat 
hängt.


Meine Versuche:
Ich habe öfters mit netstat nachgeschaut ob denn die Verbindung überhaupt 
besteht, und mein Ausgangsport 0.0.0.0:1234 bleibt unberührt, die externe IP 
Adresse ist mit dem Client verbunden, Status ist auch OK, keine Fehler.

Außerdem hat mir ein Bekannter ein SSH Zugang auf seinem Rechner zur Verfügung 
gestellt um es zu testen. HTTP-Anfragen gingen zwar immer noch nicht 
auszuwerten, dafür aber allerdings telnet. Also können eventuelle Firewall 
Filter auch nicht der Grund sein.

Außerdem:
Kann ich den Fehler hin und wieder auch netzintern beobachten, wenn ich warte 
bis alle TIME_WAIT Verbindungen beendet wurden sind und der Server nur noch 
alleine horcht, kann sich mein Browser auch nicht verbinden, die HTTP-Anfrage 
bleibt leer.

Ich vermute es gibt Probleme, da das neue Socket nicht dupliziert wird, 
sondern einfach in ein Array gespeist und dem Objekt mitgegeben wird.
Oder die Namensauflösung dauert zu lange, sodass der HTML-Header verfälscht 
wird.
Oder mein Provider funkt dazwischen.

Es wäre schön wenn ihr mir Tips geben könntetn, Beispielcode wäre natürlich 
auch gut. Ich würde auch mal eine abgespeckte Version meines Server anhängen.

Liebe Grüße,
Mike Reiche