2010-06-04 2 views
25

TCP 소켓의 경우 ECONNRESET이 RST 패킷과 관련이 있다는 것을 알고 있습니다. 하지만 AF_LOCAL 소켓에 대한 ECONNRESET 오류도 read() 및 write() 호출에서 확인했습니다. 이것은 무엇을 의미 하는가? ECONNRESET은 0을 반환하는 read()와 EPIPE를 던지는 write()와 어떻게 다릅니 까?AF_LOCAL 소켓 컨텍스트에서 ECONNRESET의 의미는 무엇입니까?

답변

73

ECONNRESET은 전송 된 미결 데이터를 읽지 않고 다른 쪽에서 연결을 닫았으며 read() 및 write()에서 트리거 될 수 있음을 나타냅니다. 그러나 정확한 동작은 운영 체제에 따라 다릅니다.

EPIPE

이미 폐쇄 된 소켓에 때 한 쓰기()의 트리거 것 같다, 더 뛰어난 나가는 데이터가 없습니다. PF_LOCAL 및 TCP 소켓 모두에 적용 가능합니다. 실시 예 (루비) 타측이 연결을 종료하고 있으며, 더 우수한 송신 데이터가없는 경우 0

가 트리거 복귀

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

리드(). PF_LOCAL 및 TCP 소켓 모두에 적용 가능합니다.

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

ECONNRESET

리눅스에 그것은 다음과 같이 작동합니다 : 아직 다른 측면에 기록되지 않은 뛰어난 나가는 데이터가있을 때

가 트리거. read()는 PF_LOCAL 및 TCP 소켓 모두에 대해 트리거하지만 write()는 TCP 소켓에만 트리거합니다. PF_LOCAL 소켓은 EPIPE를 트리거합니다.

특정 OS 동작에 대한 예제를 참조하십시오. 다른 OS가 어떻게 작동하는지 알고 있다면 기여하십시오.

예 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 소켓에서 write()

# 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 
관련 문제