tutorial sockfd socket sockaddr accept sockets posix

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