Frage

Getestet habe ich den gleichen Testcode (Server - Client) auf zwei Systeme. In einem bin ich ein SIGPIPE bekommen, in einem anderen Ich bin nicht SIGPIPE bekommen.

Das Testszenario ist so etwas wie unten:

Client

  1. Verbindung zu einem Server
  2. Empfangen von Daten von Server
  3. Daten senden
  4. Schließen Sie den Sockel

Server

  1. Nehmen Sie Verbindung von einem Server
  2. Senden von Daten an den Client
  3. Empfangen von Daten
  4. Daten senden
  5. Schließen Sie den Sockel

In einem System (Client & Server auf demselben System ausgeführt wird), geschieht SIGPIPE zufällig auf dem Client oder Server-Seite.

Aber in einem anderen System, dieses Problem geschieht nicht mit dem gleichen Test-Code.

Ich frage mich, ob Rohrbruch hat etwas mit TCP-Einstellungen zu tun.

War es hilfreich?

Lösung

Sie können auch SIGPIPE aus der Steckdose ignorieren für verhindern Absturz der Anwendung von diesem Code:

int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

Wo sd ist Buchse, wo Sie SIGPIPEs erhalten.

Andere Tipps

Das SIGPIPE Signal wird ausgelöst, wenn Sie versuchen, an eine Steckdose zu schreiben, dass das andere Ende bereits geschlossen hat. Es gibt eine Race-Bedingung hier, wenn ein Ende die Buchse um die gleiche Zeit wie das andere Ende versucht schließt Daten zu senden - die enge Benachrichtigung kann vor oder nach dem Senden empfangen werden, weshalb die SIGPIPE wird in einer Testumgebung auftreten und nicht die andere.

Im Allgemeinen Socket-aware-Anwendungen sollten SIGPIPE ignorieren und stattdessen synchron verarbeiten die resultierenden EPIPE Fehler von send().

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top