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!

È stato utile?

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);
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top