2010-06-04 13 views
25

मैं समझता हूं कि टीसीपी सॉकेट के लिए ईसीएनएनआरईएसईटीटी को आरएसटी पैकेट के साथ कुछ करना है। लेकिन मैंने AF_LOCAL सॉकेट के लिए ECONNRESET त्रुटियों को भी पढ़ा है() और लिखें() कॉल पर। इसका क्या मतलब है? ECONNRESET पढ़ने से अलग कैसे है() 0 लौट रहा है या लिखना() ईपीआईपीई फेंक रहा है?ECONNRESET का अर्थ AF_LOCAL सॉकेट के संदर्भ में क्या है?

उत्तर

73

ऐसा प्रतीत होता है कि ECONNRESET का अर्थ है कि दूसरी तरफ बकाया डेटा को पढ़ने के बिना कनेक्शन बंद कर दिया गया है, और इसे पढ़ने() और लिखने() दोनों पर ट्रिगर किया जा सकता है। लेकिन सटीक व्यवहार ऑपरेटिंग सिस्टम पर निर्भर करता है।

EPIPE

सॉकेट कि पहले से ही बंद कर दिया गया शुरू किया जा करने के लिए जब एक लिखने() रों लगता है, और कोई बकाया बाहर जाने वाले डाटा नहीं है। 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

लिनक्स पर यह इस तरह बर्ताव करता है:

उत्प्रेरित जब बकाया बाहर जाने वाले डेटा है कि नहीं किया गया है अभी तक दूसरे पक्ष के लिए लिखा गया है। पढ़ें() इसे PF_LOCAL और TCP सॉकेट दोनों के लिए ट्रिगर करता है, लेकिन लिखते हैं() इसे केवल टीसीपी सॉकेट के लिए ट्रिगर करता है; पीएफ_LOCAL सॉकेट ईपीआईपीई ट्रिगर।

विशिष्ट ओएस व्यवहार के लिए उदाहरण देखें। अगर आप जानते हैं कि अन्य ओएस कैसे व्यवहार करते हैं तो कृपया योगदान दें।

उदाहरण 1: PF_LOCAL सॉकेट पर पढ़ें()

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

उदाहरण 2: (टीसीपी सॉकेट पर पढ़ें)

# 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: टीसीपी सॉकेट पर लिखें()

# 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 
संबंधित मुद्दे