2010-06-04 84 views

回答

73

看來ECONNRESET意味着另一端已經關閉連接而沒有讀取已發送給它的未完成數據,並且可以在read()和write()兩者上觸發。但確切的行爲取決於操作系統。

EPIPE

似乎被觸發時,一個寫()s到已經被關閉套接字,並沒有什麼出色的輸出數據。適用於PF_LOCAL和TCP套接字。實施例(紅寶石):

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

讀()返回0

時對方已經關閉了連接,並且沒有突出傳出數據觸發。適用於PF_LOCAL和TCP套接字。

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

ECONNRESET

在Linux上它的行爲是這樣的:

時,有一個尚未被寫入到另一側突出的輸出數據觸發。 read()爲PF_LOCAL和TCP套接字觸發它,但是write()僅爲TCP套接字觸發; PF_LOCAL套接字觸發EPIPE。

查看特定操作系統行爲的示例。如果您知道其他操作系統的行爲,請投稿。

實施例1:對PF_LOCAL插座讀()

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

實施例2:在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 

實施例3:對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 

示例4:在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