Pregunta

I probado el mismo testcode (servidor - cliente) en dos sistemas. En una me estoy haciendo un SIGPIPE, en otro que no estoy recibiendo SIGPIPE.

El escenario de prueba es algo así como a continuación:

Cliente

  1. Conectar a un servidor
  2. recibir datos de servidor
  3. Enviar datos
  4. Cerrar el socket

Servidor

  1. aceptar la conexión de un servidor
  2. Enviar datos al cliente
  3. Recibir datos
  4. Enviar datos
  5. Cerrar el socket

En un sistema (cliente y servidor que se ejecuta en el mismo sistema), SIGPIPE está sucediendo al azar en el lado del cliente o servidor.

Sin embargo, en otro sistema, este problema no está sucediendo con el mismo código de prueba.

Me pregunto si tubería rota tiene algo que ver con la configuración de TCP.

¿Fue útil?

Solución

También puede ignorar SIGPIPE del zócalo para Prevenir la caída de la aplicación de este código:

int set = 1;
setsockopt(sd, SOL_SOCKET, SO_NOSIGPIPE, (void *)&set, sizeof(int));

Cuando sd es Allen en la recepción de SIGPIPEs.

Otros consejos

La señal SIGPIPE se eleva si se intenta escribir en un socket que el otro extremo ya ha cerrado. Hay una condición de carrera aquí, si un extremo cierra el socket en torno al mismo tiempo que los otros intentos finales para enviar datos - la notificación de cerca podría ser recibido antes o después del envío, por lo que el SIGPIPE se está produciendo en un entorno de prueba y no el otro.

aplicaciones Generalmente, socket-conscientes deben ignorar SIGPIPE, y en su lugar sincrónicamente manejar el error EPIPE resultante de send().

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top