2009-08-25 17 views
8

Se un server TCP e un client sono connessi, vorrei determinare quando il client non è più connesso. Ho pensato di poterlo fare semplicemente tentando di inviare un messaggio al client e una volta send() restituisce con un -1, posso quindi abbattere il socket. Questa implementazione funziona su Windows ma nel momento in cui provo a farlo su Linux con socket BSD, la chiamata a send() sull'app lato server causa l'arresto anomalo dell'app del server se il client non è più connesso. Non restituisce nemmeno un -1 ... termina semplicemente il programma.TCP Send non restituisce causa processo di arresto anomalo

Si prega di spiegare perché questo sta accadendo. Grazie in anticipo!

risposta

13

Ciò è causato dal segnale SIGPIPE. Vedere send(2): funzione

La mandata() è sicuro se:
[EPIPE] La presa è spento per la scrittura o la presa è connection-mode e non è più connesso. In quest'ultimo caso, e se il socket è di tipo SOCK_STREAM o SOCK_SEQPACKET e il flag MSG_NOSIGNAL non è impostato, il segnale SIGPIPE viene generato sul 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. Quindi la funzione send() restituirà -1 e imposta errno su EPIPE in questa situazione.

2

È necessario ignorare il segnale SIGPIPE. Se si verifica un errore di scrittura su un socket, il processo con get SIGPIPE e il comportamento predefinito di quel segnale è quello di uccidere il processo. Scrittura del codice di rete su * nix di solito:

signal(SIGPIPE,SIG_IGN); 
Problemi correlati