ich habe hier eine Netzwerkverbindung zwischen zwei nichtblockierenden Sockets. Wenn ich auf einer Seite versuche etwas zu lesen ohne dass die andere was gesendet hat, so bekomme ich das mit einem Fehler EAGAIN / EINPROGRESS gemeldet.
Nur: wie erfahre ich, ob die Gegenseite nicht mehr senden kann weil sie die Verbindung bereits geschlossen hat? An Hand dessen dass keine Daten mehr kommen kann ich es nicht feststellen (und eine Lösung auf Protokollebene bei der ich einfach Nachfrage ob die Gegenseite noch am Leben ist, ist nicht realisierber).
Setz' die Socket-Option SO_KEEPALIVE, dann bekommst du ein SIGPIPE, wenn die Gegenseite weg ist. Klappt nur mit Stream-Sockets (also z.B. TCP, nicht mit UDP)
$ man setsockopt
$ man 7 socket
Janka
Ich vertonne Spam immer in /dev/dsp statt /dev/null.
Ich mag die Schreie.
Ah das sieht gut aus - und wirft die nächste Frage auf: wie kann man die Timeoutzeit von SO_KEEPALIVE verändern? Sowie ich das sehe ist die mit ca. 2 Stunden recht lang...