Was verursacht den Broken Pipe Fehler?
Ich weiß, dass broken pipe-Fehler wird ausgelöst, wenn der sockel auf der peer-Seite ist geschlossen.
Aber, in meinem test habe ich festgestellt, dass eine sofortige 'senden' - Aufruf auf dieser Seite, wenn der peer-Seite geschlossen ist nicht immer führen, um eine broken pipe-Fehler.
E. g.:
Nach dem schließen des socket auf der peer-Seite (ich habe versucht, reinigen schließen durch Aufruf schließen und auch abnorme schließen durch das töten der peer), wenn ich versuche zu senden 40 bytes, dann habe ich nicht bekommen, ein gebrochenes Rohr, aber wenn ich versuche zu senden 40000 bytes dann es gibt sofort broken pipe-Fehler.
Was genau bewirkt broken pipe und kann sein Verhalten vorausgesagt werden?
InformationsquelleAutor der Frage Jay | 2011-01-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Er sich Zeit nehmen kann für das Netzwerk der Nähe beobachtet werden - die gesamte Zeit ist nominell etwa 2 Minuten (ja, Minuten!) nach einer engen, bevor die Pakete an dem port sind alle davon ausgegangen, dass Sie tot ist. Die error-Bedingung erkannt wird, irgendwann. Mit einem kleinen schreiben, dass Sie sich innerhalb der MTU des Systems, so wird die Nachricht in der Warteschlange für das senden. Mit einem großen schreiben, Sie sind größer als die MTU und das system spots das problem schneller. Wenn Sie ignorieren das SIGPIPE-signal, dann die Funktionen liefern EPIPE Fehler auf eine defekte Rohrleitung - irgendwann, wenn die kaputt-ness der Verbindung erkannt wird.
InformationsquelleAutor der Antwort Jonathan Leffler
Den aktuellen Zustand des socket wird bestimmt durch die 'keep-alive' - Aktivität. In Ihrem Fall ist dies möglich, wenn Sie die Erteilung der
send
nennen, diekeep-alive
Aktivität erzählt, dass die Steckdose aktiv ist und diesend
rufen Sie schreiben die gewünschten Daten (40 bytes) in den Puffer und gibt mit aus was alle Fehler.Wenn Sie senden ein grösseres Stück, das senden von anrufen geht bei blockierenden Zustand.
Den schicken Mann Seite auch bestätigt:
So, während der Sperre für das frei verfügbare Puffer, wenn der Anrufer mitgeteilt wird (durch keep-alive-Mechanismus) , das andere Ende ist nicht mehr vorhanden, wird der send-Aufruf fehl.
Vorhersage der genaue Szenario ist schwierig, mit den genannten Infos, aber ich glaube, dies sollte der Grund für Ihr problem.
InformationsquelleAutor der Antwort Vikram.exe
Vielleicht 40 bytes passt in die pipe-Puffer und die 40000 bytes nicht?
Edit:
Des Sendens gesendet wird, ein SIGPIPE-signal, wenn Sie versuchen, zu schreiben, zu einem geschlossenen Rohr. Ich weiß nicht genau, Wann das signal gesendet wird, oder welche Wirkung der pipe-Puffer ist auf dieser. Sie können in der Lage sein sich zu erholen durch abfangen des Signals mit der sigaction-Aufruf.
InformationsquelleAutor der Antwort Joel