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
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