Puo' capitare che bruscamente, dopo che la connessione sia stata stabilita, uno dei due peer vada giu'. In questo caso, l'altro peer non si comporta correttamente. Di default, la receive ritorna 0 come numero di bytes ricevuti, per cui il peer non si accorge che l'altro peer non e' attivo, mentre la send ritorna -1, setta la variabile errno al valore EPIPE e lancia il segnale SIGPIPE, che normalmente fa uscire il processo.
Per evitare che il processo termini in seguito al segnale SIGPIPE si puo' settare l'opzione MSG_NOSIGNAL nella send in modo che il segnale SIGPIPE venga ingnorato.
In particolare:
iNumBytes = send(iSocket, _vMessage, _iMessageSize, MSG_NOSIGNAL);
if(iNumBytes == -1)
{
if(errno == EPIPE)
{
// gestisco l'errore
return 0;
}
}
Nel caso della receive, invece posso semplicemente gestire il caso in cui il numero di bytes ritornati e' 0.
Per evitare che il processo termini in seguito al segnale SIGPIPE si puo' settare l'opzione MSG_NOSIGNAL nella send in modo che il segnale SIGPIPE venga ingnorato.
In particolare:
iNumBytes = send(iSocket, _vMessage, _iMessageSize, MSG_NOSIGNAL);
if(iNumBytes == -1)
{
if(errno == EPIPE)
{
// gestisco l'errore
return 0;
}
}
Nel caso della receive, invece posso semplicemente gestire il caso in cui il numero di bytes ritornati e' 0.