2012-01-03 9 views
9

मान लें कि स्थानीय लिनक्स होस्ट पर एक टीसीपी सॉकेट एक रिमोट होस्ट के साथ एक कनेक्टेड स्थिति में है। स्थानीय होस्ट दूरस्थ होस्ट के साथ सॉकेट पर घटनाओं के बारे में अधिसूचित होने के लिए epoll_wait का उपयोग कर रहा है।एपोल और रिमोट 1-रास्ता शट डाउन

दूरस्थ होस्ट कॉल करने के लिए थे, तो:

shutdown(s,SHUT_WR); 

अपनी जुड़ा सॉकेट पर ऐसा किया जाता है इंगित करने के लिए संचारण, क्या घटना (रों) अपने सॉकेट के लिए स्थानीय होस्ट पर वापसी epoll_wait होगा?

मुझे लगता है कि ईपोलिन हमेशा वापस आ जाएगा और बाद में आरईवी कॉल 0 वापस लौटाएगा ताकि रिमोट साइड ट्रैनमिटिंग समाप्त हो सके।

EPOLLHUP या EPOLLRDHUP के बारे में क्या? (और इन दो घटनाओं के बीच क्या अंतर है)?

या यहां तक ​​कि EPOLLERR?

यदि रिमोट होस्ट "शट डाउन" के बजाय "बंद" कहता है, तो उपरोक्त में से किसी भी परिवर्तन का उत्तर क्या है?

उत्तर

18

उत्तर खोजने के लिए भारी उठाने के बाद मैं इसका उत्तर दे रहा हूं।

एक सॉकेट epoll घटनाओं के लिए सुनने के लिए आम तौर पर बुला पास या बंद (SHUT_WR) दूरस्थ सहकर्मी पर एक EPOLLRDHUP (EPOLLIN के अलावा) घटना झंडा प्राप्त होगा। इसका मतलब यह नहीं है कि सॉकेट मर चुका है। Recv() के बाद के कॉल सॉकेट पर किसी भी अपठित डेटा को वापस कर देंगे और अंत में "0" ईओएफ इंगित करने के लिए वापस कर दिया जाएगा। रिमोट पीयर ने केवल अपनी सॉकेट का आधा-करीब किया है, तो डेटा वापस भेजना भी संभव हो सकता है।

एक उल्लेखनीय अपवाद यह है कि रिमोट पीयर अपने सॉकेट पर "0" के लिंगर मान के साथ सक्षम SO_LINGER विकल्प का उपयोग कर रहा है। इस तरह के सॉकेट को बंद करने का नतीजा एक एफआईएन के बजाय एक टीसीपी आरएसटी भेजा जा सकता है। जो मैंने पढ़ा है, उससे एक कनेक्शन रीसेट इवेंट या तो ईपोलहप या ईपीओएलएलईआरआर उत्पन्न करेगा। (मेरे पास पुष्टि करने का समय नहीं है, लेकिन यह समझ में आता है)।

कुछ दस्तावेज हैं जो सुझाव देते हैं कि पुराने लिनक्स कार्यान्वयन हैं जो EPOLLRDHUP का समर्थन नहीं करते हैं, क्योंकि इसके बजाय EPOLLHUP उत्पन्न होता है।

और क्या इसके लायक है, मेरी विशेष मामले में के लिए, मैंने पाया कि यह बहुत दिलचस्प कोड है कि विशेष मामलों EPOLLHUP या EPOLLRDHUP घटनाओं के लिए नहीं है। इसके बजाए, इन घटनाओं को केवल EPOLLIN/EPOLLOUT के समान व्यवहार करें और recv() (या भेजें() को उपयुक्त के रूप में कॉल करें)। लेकिन रिकवरी कोड पर वापस लौटने के लिए रिटर्न कोड पर ध्यान दें और भेजें()।

+1

मेरे यहां व्यवहार के बारे में अधिक प्रश्न थे, इसलिए मैंने इन इंटरैक्शन में विस्तृत गोताखोरी की: https://medium.com/where-the-flamingcow-roams/down-the-epoll-rabbit-hole-5c0447cb6329 – flamingcow

 संबंधित मुद्दे

  • कोई संबंधित समस्या नहीं^_^