2010-06-04 17 views
25

TCP soketler için ECONNRESET'in RST paketleri ile bir ilgisi olduğunu anlıyorum. Ancak, read() ve write() çağrıları için de AF_LOCAL soketleri için ECONNRESET hatalarını gördüm. Ne anlama geliyor? ECONNRESET, read() 0'dan dönen veya EPIPE atanmış yazma() 'dan nasıl farklıdır?ECONNRESET, AF_LOCAL soketi bağlamında ne anlama geliyor?

cevap

73

ECONNRESET, diğer tarafın kendisine gönderilen olağanüstü verileri okumadan bağlantıyı kapattığı ve hem read() hem de write() üzerinde tetiklenebileceği anlamına gelir. Fakat tam olarak davranış, işletim sistemine bağlıdır.

EPIPE

zaten kapatılmış bir sokete zaman bir yazma() ler tetiklenebilir görünüyor ve hiçbir olağanüstü giden veri yoktur. PF_LOCAL ve TCP soketlerine uygulanabilir. Örnek (Yakut): Diğer yandan bağlantı kapattı ve bir üstün giden veri olduğunda 0

Harekete geçirilmiş dönen

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

okuma(). PF_LOCAL ve TCP soketlerine uygulanabilir.

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

ECONNRESET

Linux'ta böyle davranır: Henüz diğer tarafa yazılmadı olağanüstü giden veri varken

Tetiklendi. read(), hem PF_LOCAL hem de TCP soketleri için tetikler, ancak write() sadece TCP soketleri için tetikler; PF_LOCAL soketleri EPIPE'yi tetikler.

Belirli işletim sistemi davranışlarına yönelik örneklere bakın. Diğer işletim sistemlerinin nasıl davrandığını biliyorsanız lütfen katkıda bulunun.

Örnek 1: (okuma) PF_LOCAL yuvada

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

Örnek 2: TCP yuvasında) (

# 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 

Örnek 3 okuyun: (yazma) PF_LOCAL yuvada

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

Örnek 4: TCP soketine yaz()

# 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