2010-06-04 6 views

Antwort

73

Es scheint, dass ECONNRESET bedeutet, dass die andere Seite die Verbindung geschlossen hat, ohne ausstehende Daten zu lesen, die an sie gesendet wurden, und kann sowohl bei read() als auch bei write() ausgelöst werden. Das genaue Verhalten hängt jedoch vom Betriebssystem ab.

EPIPE

Scheint ausgelöst zu werden, wenn ein write() s an eine Steckdose, die bereits geschlossen wurde, und es gibt keine ausstehenden ausgehende Daten. Anwendbar für PF_LOCAL- und TCP-Sockets. Beispiel (Rubin):

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

read() zurückkehr 0

ausgelöst, wenn die andere Seite der Verbindung geschlossen hat, und es gibt keine ausstehenden ausgehende Daten. Anwendbar für PF_LOCAL- und TCP-Sockets.

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

ECONNRESET

Auf Linux verhält es sich wie folgt aus:

ausgelöst, wenn herausragende abgehende Daten ist es, die noch nicht auf die andere Seite geschrieben hat. read() triggert es sowohl für PF_LOCAL- als auch TCP-Sockets, aber write() triggert es nur für TCP-Sockets; PF_LOCAL Sockets lösen EPIPE aus.

Siehe Beispiele für spezifisches Betriebssystemverhalten. Bitte tragen Sie dazu bei, wenn Sie wissen, wie sich andere Betriebssysteme verhalten.

Beispiel 1: read() auf PF_LOCAL Buchse

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

Beispiel 2: read() auf TCP-Socket

# 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 

Beispiel 3: write() auf PF_LOCAL Buchse

a, b = UNIXSocket.pair 
a.write("hello") 
b.close 
a.write("world") 
# Linux: EPIPE and not ECONNRESET 
# OS X : EPIPE and not ECONNRESET 

Beispiel 4: write() auf TCP-Socket

# 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 
Verwandte Themen