Domanda

ho provato lo stesso testcode (Server - Client) è su due sistemi. In uno sto ottenendo un SIGPIPE, in un altro Non ricevo SIGPIPE.

Lo scenario di prova è qualcosa di simile di seguito:

Client

  1. connettersi a un server
  2. ricevere dati dal server
  3. Invia dati
  4. chiudere il socket

Server

  1. accettare la connessione da un server
  2. Invia dati al client
  3. Ricezione dati
  4. Invia dati
  5. chiudere il socket

In un unico sistema (client e server in esecuzione sullo stesso sistema), SIGPIPE sta accadendo in modo casuale sul lato client o server.

Ma, in un altro sistema, questo problema non è accadendo con lo stesso codice di prova.

Mi chiedo se tubo rotto ha qualcosa a che fare con le impostazioni TCP.

È stato utile?

Soluzione

Si può anche ignorare SIGPIPE da presa per il crash dell'applicazione Prevenire da questo codice:

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

Dove sd è presa dove si riceve SIGPIPEs.

Altri suggerimenti

Il segnale SIGPIPE viene generato se si tenta di scrivere ad una presa che l'altra estremità ha già chiuso. C'è una condizione di competizione qui, se una delle estremità chiude la presa intorno allo stesso tempo come gli altri tentativi finali di inviare i dati - la stretta di notifica potrebbe essere ricevuto prima o dopo l'invio, che è il motivo per cui la SIGPIPE si sta verificando in un ambiente di prova e non l'altro.

applicazioni Generalmente, invasature consapevole dovrebbero ignorare SIGPIPE, e invece sincrono gestire l'errore risultante da EPIPE send().

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top