2010-06-04 12 views
25

Je comprends que pour les sockets TCP, ECONNRESET a quelque chose à voir avec les paquets RST. Mais j'ai aussi vu des erreurs ECONNRESET pour les sockets AF_LOCAL, sur les appels read() et write(). Qu'est-ce que ça veut dire? En quoi ECONNRESET est-il différent de read() en retournant 0 ou write() en lançant EPIPE?Que signifie ECONNRESET dans le contexte d'une socket AF_LOCAL?

Répondre

73

Il semblerait que ECONNRESET signifie que l'autre côté a fermé la connexion sans lire les données en attente qui lui ont été envoyées, et peut être déclenché à la fois sur read() et write(). Mais le comportement exact dépend du système d'exploitation.

EPIPE

semble être déclenchée quand une écriture() s à une prise qui a déjà été fermé, et il n'y a pas de données sortantes en circulation. Applicable aux sockets PF_LOCAL et TCP. Exemple (Ruby):

a, b = UNIXSocket.pair 
b.close 
a.write("foo") # => EPIPE, on all OSes 

read() retournant 0

déclenché lorsque l'autre côté a fermé la connexion, et il n'y a pas de données sortantes en circulation. Applicable aux sockets PF_LOCAL et TCP.

a, b = UNIXSocket.pair 
b.close 
a.read # => 0 bytes, on all OSes 

ECONNRESET

Sur Linux, il se comporte comme ceci:

Déclenchée quand il y a des données de sortie exceptionnelle qui n'a pas encore été écrit à l'autre côté. read() le déclenche pour les sockets PF_LOCAL et TCP, mais write() le déclenche uniquement pour les sockets TCP; Les sockets PF_LOCAL déclenchent EPIPE.

Voir les exemples de comportement spécifique du système d'exploitation. S'il vous plaît contribuer si vous savez comment les autres systèmes d'exploitation se comportent.

Exemple 1: lecture() sur la prise PF_LOCAL

a, b = UNIXSocket.pair 
a.write("hello") 
b.close 
a.read 
# Linux: ECONNRESET 
# OS X : returns 0 bytes 

Exemple 2: lire() sur 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 

Exemple 3: écriture() sur la prise 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 

Exemple 4: write() sur le 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