TCP Invia non restituisce causa processo di crash
Domanda
Se si collegano un server TCP e cliente, mi piacerebbe per determinare quando il client non è più collegato. Ho pensato che posso semplicemente farlo tentando di inviare un messaggio al client e una volta send () ritorna con un -1, posso quindi abbattere la presa. Questo funziona implementazione trovano su Windows, ma il minuto ho provare a fare questo su Linux con socket BSD, la chiamata a send () su App lato server causa la mia app server per mandare in crash se il client non è più collegato. Non ha nemmeno restituire un -1 ... appena termina il programma.
Si prega di spiegare perché questo sta accadendo. Grazie in anticipo!
Soluzione
Questo è causato dal segnale SIGPIPE. Vedere send(2)
:
La funzione send () verrà meno se:
[EPIPE] La presa è spento per la scrittura o la presa è la connessione in modalità ed è collegata più. In quest'ultimo caso, se la presa è di tipo SOCK_STREAM o SOCK_SEQPACKET e il flag MSG_NOSIGNAL non è impostato, il segnale viene generato SIGPIPE al thread chiamante.
È possibile evitare questo utilizzando il flag MSG_NOSIGNAL
sulla chiamata send()
, o ignorando il segnale SIGPIPE
con signal(SIGPIPE, SIG_IGN)
all'inizio del vostro programma. Allora la funzione send()
restituirà -1 e impostare errno
a EPIPE
in questa situazione.
Altri suggerimenti
È necessario ignorare il segnale di SIGPIPE. Se un errore di scrittura si verifica su un socket, il processo con get SIGPIPE, e il comportamento predefinito di quel segnale è quello di uccidere il processo. Scrivendo codice di rete su * nix di solito si desidera:
signal(SIGPIPE,SIG_IGN);