La documentación oficial de
send dice que
cuando se llama a send
sobre un socket que el otro endpoint cerró,
el proceso recibe una señal SIGPIPE
.
Si el proceso no procesa dicha señal, el proceso termina con el error Broken Pipe.
Para evitar estar manejando señales, se debe pasar por parámetro al
send
el flag MSG_NOSIGNAL
.
De esa manera se puede revisar si el socket esta cerrado o no verificando el código de error:
int ret = send(fd, buf, sz, MSG_NOSIGNAL);
if (ret == -1) {
if (errno == EPIPE) {
// socket cerrado: puede o no ser un error real, depende del protocolo
} else {
// otro error
}
}
Revisar como usar errno
recv()
no necesita de MSG_NOSIGNAL
. Es un error usar ese flag
en recv()
.