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().