SigPipe (Broken Pipe)

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