# socket.setKeepAlive() geht nicht?



## ajva (17. Jun 2008)

Tag. Ich habe einen kleinen Webserver programmiert, den man leider mit dem Firefox folgendermaßen aus dem Tritt bringen kann:

(auf ubuntu) Man "surft" eine große Video-Datei an. Firefox fängt an die abzuspielen mit dem Totemplugin. Dann klickt man z.B. auf zurück. Firefox zeigt die voherige Seite. Mein Server aber hängt in der Schleife, die folgendermaßen aussieht:


```
byte b[] = new byte[1024]; 
while(FIS.available() > 0){
   int act_read = FIS.read(b, 0, 1024);
   OS.write(b, 0, act_read);
}
```
Dabei ist FIS mein FileInputStream und OS mein vom Socket erhaltener OutputStream.

Ich habe mit Wireshark geschaut, was vor sich geht. Der Server erhält nach dem Klick auf Firefoxes zurück ein TCP Zero Window und reagiert mit Keep-Alive. Ich dachte nun, ich könnte ihm das Keep-Alive einfach mit socket.setKeepAlive(false) verbieten, aber das scheint nichts zu bewirken.

Jedenfalls kann ich das so oft machen, bis meine max. Anzahl an erlaubten Threads in ihren Schleifen hängen und dann ist der Server komplett lahm gelegt... :-(

Hat Jemand einen Rat?


----------



## tuxedo (17. Jun 2008)

Ich hätte jetzt vermutet, dass die Socketverbindung abbricht wenn du im Browser auf "zurück" klickst. 

Wo schreibt denn der Server hin wenn die Verbindung nicht abbricht und der Client sich nicht mehr drum schert?

- Alex


----------



## ajva (17. Jun 2008)

Tja, er schreibt nicht. Im Netzwerk sind laut Wireshark nur die Zero Windows und die Keep-Alives unterwegs. Keine Daten. Die Whileschleife wird nicht verlassen, eine Exception wird auch nicht geworfen.
Es scheint, als ob OS.write(...) einfach wartet, dass der Browser wieder Daten annimmt (ich kenne übrigens keinen Weg ihn dazu zu bewegen).
Wenn ich das ganze per VLC oder wget mache, habe ich keine probleme. Ich kann abbrechen, pauseieren und fortsetzen.
Bei Abbruch gibt es eine Connection Reset-Exception und ich kann den Socket schließen/Thread stirbt.

Der Firefox macht übrigens nochwas komisches: wenn er die Datei überträgt (oder wenn ich die Übertragung in diesen komischen Hängezustand versetzt habe), dann kann ich die Datei nicht nochmal per FF anfordern. Der FF schickt einfach die Anfrage nicht mehr als einmal. Erst wenn ich "Private Daten löschen" mache, fragt er wieder nach der Datei.

Mir ist es eigentlich nicht so wichtig, dass man einen Film im Browser schauen kann (das alles geht allerdings nur mit MEINEM Server nicht, daher sollte ich den Fehler schon bei diesem suchen). Naja, wichtig ist mir zuerst mal, dass man auf diese Weise den Server nicht lahmlegen kann. Vielleicht könnte ich überwachen, ob die schleife noch arbeitet und ein Timeout einbauen.


----------

