J
Chris2103 schrieb:
Wie setzt man den Timout (Syntax, Funktionnen)?
Timeouts sollte man auf Client-Seite setzen können mit setsockopt(), entweder mit SO_SNDTIMEO fürs Senden oder SO_RCVTIMEO fürs Lesen (oder beides). Damit müßtest Du Dein Problem lösen können. Ich habe aber beides in dem von mir beschriebenen Zusammenhang selbst nicht benutzt (kann daher nicht auf die Schnelle mit einem funktionierenden Beispiel dienen). Ich schätze mal, dass es unsinnig ist, serverseitig ein Timeout zu setzen (der Datenkanal steht erst nach dem accept() zur Verfügung, und auf dem listen/accept-socket macht serverseitig ein Timeout nun wirklich keinen Sinn).
Wenn ich die (linux)-manual-pages richtig interpretiere, bekommt man nach Aktivierung der Timeout-Option und Eintreten eines Timeouts als Return-Wert entweder
(a) einen anderen Bytecount als die zu übertragende bzw. zu emfangende Anzahl zurück oder
(b) einen negativen Wert (-1) und als errno EAGAIN (write-Richtung) oder EWOULDBLOCK (read-Richtung) zurück.
In der Regel hat man aber auch keinen Bedarf, einen Timeout auf Client-Seite setzen zu müssen. Nach der von mir beschriebenen Methode läuft das folgendermaßen: Wenn die Resourcen nicht zur Verfügung stehen, wartet der Client, bis wieder etwas frei wird.
Alternativ zum obigen Timeout kann man allerdings bei Erreichen des Resourcen-Limits auch weitere Connect-Requests annehmen und sofort serverseitig eine qualifizierte Return/Error-Message an den Client zurücksenden (vorausgesetzt, die zu verwaltenden Resourcen sind nicht ausgerechnet Filedescriptoren, so dass man gar keine accept()'s mehr korrekt durchführen kann