sockets - sockfd - ¿Qué significa ECONNRESET en el contexto de un socket AF_LOCAL?
sockfd socket (1)
Entiendo que para los sockets TCP, ECONNRESET tiene algo que ver con los paquetes RST. Pero también he visto errores ECONNRESET para sockets AF_LOCAL, en las llamadas read () y write (). ¿Qué significa esto? ¿En qué se diferencia ECONNRESET de read () devolviendo 0 o write () lanzando EPIPE?
Parece que ECONNRESET significa que el otro lado ha cerrado la conexión sin leer los datos pendientes que se le han enviado, y puede activarse en read () y write (). Pero el comportamiento exacto depende del sistema operativo.
EPIPE
Parece que se activa cuando uno escribe (s) en un socket que ya se ha cerrado, y no hay datos de salida pendientes. Aplicable a ambos sockets PF_LOCAL y TCP. Ejemplo (Ruby):
a, b = UNIXSocket.pair
b.close
a.write("foo") # => EPIPE, on all OSes
read () devolviendo 0
Se activa cuando el otro lado ha cerrado la conexión, y no hay datos salientes pendientes. Aplicable a ambos sockets PF_LOCAL y TCP.
a, b = UNIXSocket.pair
b.close
a.read # => 0 bytes, on all OSes
ECONNRESET
En Linux se comporta así:
Se activa cuando hay datos salientes pendientes que aún no se han escrito en el otro lado. read () lo activa para los sockets PF_LOCAL y TCP, pero write () lo desencadena solo para sockets TCP; Los zócalos PF_LOCAL activan EPIPE.
Vea ejemplos de comportamiento específico del sistema operativo. Contribuya si sabe cómo se comportan otros sistemas operativos.
Ejemplo 1: read () en el socket PF_LOCAL
a, b = UNIXSocket.pair
a.write("hello")
b.close
a.read
# Linux: ECONNRESET
# OS X : returns 0 bytes
Ejemplo 2: read () en el socket TCP
# Side A # Side B
s = TCPServer.new(''127.0.0.1'', 3001)
c = s.accept
c = TCPSocket.new(''127.0.0.1'', 3001)
c.write("hello")
c.close
c.read
# Linux: ECONNRESET
# OS X : returns 0 bytes
Ejemplo 3: write () en el socket PF_LOCAL
a, b = UNIXSocket.pair
a.write("hello")
b.close
a.write("world")
# Linux: EPIPE and not ECONNRESET
# OS X : EPIPE and not ECONNRESET
Ejemplo 4: write () en el socket TCP
# Side A # Side B
s = TCPServer.new(''127.0.0.1'', 3001)
c = s.accept
c = TCPSocket.new(''127.0.0.1'', 3001)
c.write("hello")
c.close
c.write("world")
# Linux: ECONNRESET
# OS X : no error