Se uno qualsiasi dei SIGPIPE impatto TCP Impostazioni?
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
- connettersi a un server
- ricevere dati dal server
- Invia dati
- chiudere il socket
Server
- accettare la connessione da un server
- Invia dati al client
- Ricezione dati
- Invia dati
- 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.
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()
.