Hallo Bio,
Die Frage ist aber: Kriegt man eine Exception, wenn man ein select auf die verdaechtigen Deskriptoren macht, wenn der Timeout abgelaufen ist?
Oder muss man ein read versuchen, und bekommt dann 0 zurueck, und ggf. einen Socket Error, den man sich mit getsockopt holen muss, oder beides?
ich hab' mal in alten Sourcen von mir gewühlt. Ich habe bei einem Server dabei folgendermaßen auf Verbindungs-Abbrüche reagiert:
1. Wenn read() auf einen Socket mit Returncode < 0 zurückkommt, liegt ein Fehler auf dem Socket vor. Reaktion: dazugehörenden fd schließen. Den Fehlercode habe ich aus errno ausgelesen.
2. Returncode 0 bei read() heisst nur EOF; die Verbindung kann trotzdem noch bestehen.
3. Ich habe das Signal SIGPIPE abgefangen. SIGPIPE wird an den Prozess gesendet, der mit dem Socket verbunden ist, falls nicht mehr auf einen Socket geschrieben werden kann. Reaktion wie bei 1.
Der Server war so designed, dass jede Verbindung in einem eigenen Prozess behandelt wurde. I.d.R. warteten die Prozesse dabei auf einem read() auf Daten der Clients. Wurde die Verbindung unterbrochen, kehrte der read() mit einem Returncode < 0 zurück.
SO_KEEPALIVE habe ich in der ganzen Anwendung nicht benötigt.
Viele Grüße
Frank