# Frage zu SO_TIMEOUT



## Kr0e (11. Jan 2009)

Hi, ich habe neulich mal die Funktion setSoTimout bei den Sockets gefunden...
So, da habe ich mir gedacht, dass is ne Standardfunktion der Socketapi... Aber fehlanzeige...
Bei der normalen SocketApi habe ich nirgends ein FLAG namens SO_TIMEOUT gefunden.. (C++ Impl.)

Nun meine Frage: Ist diese Funktion etwas spezielles von Java ? Sprich einer Art 2. Thread, der im Hintergrund nach dem Ablauf dieser Zeit, einfach gewaltsam den Lesevorgang abbricht ? 
2. FRage: Kann häufiges WEchseln dieses Wertes eine Datenübertragung verlangsamen ?
-> Ich benutze das gerade im folgenden Zusammenhang (Blocking Sockets natürlich...) : Ich lese in einem Thread zuerst mit einem Timeout von 0.. Sprich der Thread liegt solange auf Eis, bis Daten eingehen... Aber sobald die ersten Daten eingegangen sind aber noch nicht ausreichen, weil z.b. mein Header größer ist, als die eingegangen Daten, so schalte den Timeout auf 30 sekunden. Wenn mein Header vollständig ist, schalte ich zurück auf 0 und warte solange bis der nächste Request eingeht... Ist das ok, oder ist das "schelchter" Stil ?

Gruß Chris


----------



## tuxedo (14. Jan 2009)

Hört sich eher an an solltest du non-blocking-sockets benutzen....

Der Timeout ist nicht dazu gedacht ständig geändert zu werden damit die Programmlogik sauber läuft.

Wenn bisher zu wenig Daten eingegangen sind machst du einfach nochmal ein read() und wartest auf den Rest der Daten. 

Das "warten" mit einem gesetzten Timeout zu unterbrechen macht doch im block-mode keine Sinn. Da bist du eh gezwungen Threads zu benutzen und dann ist es egal ob der eine Thread jetzt beim read() blockiert bis wieder Daten da sind.

- Alex


----------



## Kr0e (14. Jan 2009)

Ne, meine Überlegung war folgende:
Angenommen ich bekommen 4 bytes Headerdaten von einem Clienten. Aber ein Standardheader ist 8 bytes groß,
 so dann warte ich natürlich bis der Rest da ist. Aber angenommen, der Client senden nun 30 sekunden nichts, dann kann das ja nur heißen, dass da iwas nicht so ganz richtig läuft... Und ich dachte halt dafür sind TIMEOUTs da...
Ich hatte mir das überlegt, um Rechenleistung zu sparen. Wenn quasi ein Client dranhängt, der zuwenig sendet (Bei meinem Protokoll wird nämlich immer ein Header erwartet) und dies innerhalb von z.b. 30 sek. nicht zuende bringt, dann belastet der ja unnötig meinen Server. So wie als wenn man zulange keine Daten sendet und man gekickt wird vom Server. Ich weiß halt nicht wie Timeouts intern funktionieren. Ist das eine SocketOption, oder ist das bei Java ein paralleler Thread der mitläuft udn bei mehr als 30 seks block quasi, ne Exception wirft...

Gruß Chris


----------



## tuxedo (14. Jan 2009)

wenn ein read() ansteht, und der client wegbricht, dann gibts eine IOException.

"Rechenleistung" sparst du dir in keinem Fall. Denn ein Thread der nix zu tun hat braucht keine CPU Last. Nur Ressourcen. Und wenn du nicht gerade 1000 solcher Clients hast, dann ist das vermutlich zu vernachlässigen. 

Ich denke du versteifst dich da auch auf ein Problem, welches nicht so breit getreten werden muss/sollte. Entweder der Client stirbt irgendwann weg was eine IOException auslöst, oder das Paket lässt  nur etwas länger auf sich warten. 

- Alex


----------

