Tengo una aplicación que consta de dos procesos (llamémoslos A y B), conectados entre sí a través de sockets de dominio Unix. La mayoría de las veces funciona bien, pero algunos usuarios informan del siguiente comportamiento:¿Qué puede causar un error EPIPE espontáneo sin finalizar la llamada close() o bloquearse?
- A envía una solicitud a B. Esto funciona. A comienza a leer la respuesta de B.
- B envía una respuesta a A. La llamada write() correspondiente devuelve un error EPIPE, y como resultado B cierra() el socket. Sin embargo, A hizo no close() el socket, ni se bloqueó.
- La llamada a read() de A devuelve 0, indicando el fin del archivo. A piensa que B cerró prematuramente la conexión.
usuarios también han informado de variaciones de este comportamiento, por ejemplo:
- A envía una solicitud a B. Esto funciona parcialmente, pero antes de que toda la solicitud se envía escritura de A() llamada devuelve EPIPE, y como resultado A close() el socket. Sin embargo, B no cerró() el socket, ni se bloqueó.
- B lee una solicitud parcial y de repente obtiene un EOF.
El problema es que no puedo reproducir este comportamiento localmente. He probado OS X y Linux. Los usuarios están en una variedad de sistemas, principalmente OS X y Linux.
cosas que ya he probado y considerado:
- doble cierre() (cerrar insectos() se llama dos veces en el mismo descriptor de archivo): Probablemente no como que daría lugar a errores EBADF, pero No los he visto.
- Aumentando el límite máximo de descriptor de archivo. Un usuario informó que esto funcionó para él, el resto informó que no.
¿Qué otra cosa puede causar un comportamiento como este? Sé con certeza que ni A ni B cierran() el zócalo prematuramente, y sé con certeza que ninguno de ellos se ha bloqueado porque tanto A como B pudieron informar el error. Es como si el kernel de repente decidiera desconectar el enchufe del zócalo por alguna razón.
Resultó que el descriptor de archivo del servidor se agregó con el indicador EPOLLET a la cola de epoll que parece estar equivocado. – user206268
¡No es exactamente la respuesta que estaba buscando, pero la página TCP a la que se vinculó es muy informativa! Ahora está abajo por Archive.org todavía lo tiene: http://ia700609.us.archive.org/22/items/TheUltimateSo_lingerPageOrWhyIsMyTcpNotReliable/the-ultimate-so_linger-page-or-why-is-my-tcp-not-reliable .html – Hongli