Was ist die beste Vorgehensweise, um den Absturz hier zu verhindern?
Deaktivieren Sie entweder die Sigpipes für alle oder fangen Sie den Fehler ab und ignorieren Sie ihn.
Gibt es eine Möglichkeit zu überprüfen, ob die andere Seite der Zeile noch liest?
Ja, verwenden Sie select ().
select () scheint hier nicht zu funktionieren, da immer angegeben wird, dass der Socket beschreibbar ist.
Sie müssen sich auf die Auswahl lesen Bits. Sie können die Schreibbits wahrscheinlich ignorieren .
Wenn das entfernte Ende sein Dateihandle schließt, zeigt Ihnen select an, dass Daten zum Lesen bereit sind. Wenn Sie das lesen, erhalten Sie 0 Bytes zurück. Auf diese Weise teilt Ihnen das Betriebssystem mit, dass das Dateihandle geschlossen wurde.
Das einzige Mal, wenn Sie die Schreibbits nicht ignorieren können, ist, wenn Sie große Volumes senden, und es besteht die Gefahr, dass das andere Ende überlastet wird, was dazu führen kann, dass sich Ihre Puffer füllen. In diesem Fall kann der Versuch, in das Dateihandle zu schreiben, dazu führen, dass Ihr Programm / Thread blockiert oder fehlschlägt. Das Testen von select vor dem Schreiben schützt Sie davor, garantiert jedoch nicht, dass das andere Ende fehlerfrei ist oder dass Ihre Daten eintreffen.
Beachten Sie, dass Sie eine Sigpipe sowohl von close () als auch beim Schreiben erhalten können.
Durch Schließen werden alle gepufferten Daten gelöscht. Wenn das andere Ende bereits geschlossen wurde, schlägt das Schließen fehl und Sie erhalten ein Sigpipe.
Wenn Sie gepuffertes TCPIP verwenden, bedeutet ein erfolgreicher Schreibvorgang nur, dass Ihre Daten zum Senden in die Warteschlange gestellt wurden. Dies bedeutet nicht, dass sie gesendet wurden. Bis Sie erfolgreich close anrufen, wissen Sie nicht, dass Ihre Daten gesendet wurden.
Sigpipe sagt Ihnen, dass etwas schief gelaufen ist, es sagt Ihnen nicht, was oder was Sie dagegen tun sollten.