How epoll detect clientside close in Python? -


यहां मेरा सर्वर है

  "" "सर्वर का उपयोग कर एपोल विधि "आयात" आयात आयात से आयात सॉकेट आयात समय का चयन करें oodict addr = ('localhost', 8989) s = socket.socket (socket.AF_INET, socket.SOCK_STREAM) s.setsockopt (socket.SOL_SOCKET, सॉकेट) SO_REUSEADDR, 1) s.bind (addr) s.listen (8) s.setblocking (0) # गैर ब्लॉकिंग सॉकेट सर्वर epoll = select.epoll () epoll.register (s.fileno (), select.EPOLLIN) # स्तर ट्रिगर किए गए सीएस = {} डेटा = '' ट्रू: टाइम.सॉल (1) इवेंट = एपोल पॉल (1) # टाइमआउट 1 सेकेंड प्रिंट 'पोलिंग% डी इवेंट' फ़िलोन के लिए% len (इवेंट), इवेंट में इवेंट: यदि Fileno == s.fileno (): sk, addr = s.accept () sk.setblocking (0) प्रिंट ऐडर सीएस [sk.fileno ()] = sk epoll.register (sk.fileno (), select.EPOLLIN) एलीफ़ घटना & amp; चयन करें। एपोलिन: डेटा = सीएस [फाइलें] .आरईसीवी (4) प्रिंट 'आरक्यूवी', डेटा एपोल। मॉडेइवेट (फ़लेनो, चयन करें। एपोलॉल) एलीफ़ इवेंट & amp; चयन करें। एपोलॉउट: प्रिंट 'भेजें', डेटा सीएस [फाइलें] .सेंड (डेटा) डेटा = '' एपोल। एमडीइडेइफिफ (फ़लेनो, चयन करें। एपोलिन) एलीफ़ इवेंट & amp; का चयन करें। एपोलर: प्रिंट 'err' epoll.unregister (fileno)  

क्लाइंट साइड इनपुट

  ideer @ ideer: / Home / chenz / source / ideerfs $ telnet localhost 8989 कोशिश कर रहा है: 1 ... 127.0.0.1 की कोशिश कर रहा है ... स्थानीयहोस्ट से कनेक्ट किया गया एस्केप वर्ण '^]' है 123456 123456 ^] टेलनेट & gt; Q कनेक्शन बंद हुआ  

सर्वर साइड आउटपुट

  ideer @ ideer: / chenz / source / ideerfs $ python epoll.py मतदान 0 घटनाओं मतदान 0 घटनाओं मतदान 1 घटनाओं ('127.0.0.1', 53975) मतदान 0 घटनाएं मतदान 1 घटनाएं 12 मार्च मतदान 1 घटनाएं 1234 मतदान 1 मतदान प्रक्रिया 1 घटनाक्रम 56 मतदान 1 घटनाक्रम 56 मतदान 0 घटनाएँ मतदान 0 घटनाएँ मतदान 0 घटनाएं मतदान 1 घटनाएं पोलिंग 1 इवेंट्स पोलिंग 1 इवेंट recv पोलिंग 1 इवेंट्स भेजें पोलिंग 1 इवेंट रिकव पोलिंग 1 इवेंट्स पोलिंग 1 इवेंट्स रीवॉव ↑ सीट्रेसबैक (सबसे हाल ही में कॉल अंतिम): फ़ाइल "एपोलैंज़व", लाइन 23, & lt; मॉड्यूल & gt; Time.sleep (1) कुंजीपटल इनरॉर्च  

यह अजीब बात है कि ग्राहक ने कनेक्शन बंद करने के बाद, अभी भी ईपोल चुनाव कर सकता है और घटनाओं को भेज सकता है! ईपीोलरर घटना क्यों कभी नहीं होता है? यह एक ही है अगर आप ईपीओएलएलयूयूपी का उपयोग करते हैं।

मैंने नोट किया है कि ईपीओलरआरआर घटना केवल तब होता है जब आप एक बंद कनेक्शन लिखने का प्रयास करते हैं। इसके अलावा, क्या यह बताने का एक और तरीका है कि कनेक्शन बंद हो गया है या नहीं?

क्या कनेक्शन को बंद करने के लिए सही है अगर आपको ईपीलाइन में कुछ नहीं मिलता है?

EPOLLERR और EPOLLHUP पोस्ट में चिपकाए गए कोड में ऐसा कभी नहीं होता है क्योंकि वे हमेशा एक ईपीलिंग या ईपीओएलओएलएटी (इनमें से कई को एक बार में सेट किया जा सकता है), इसलिए यदि / या / अन्य ने हमेशा एक ईपीलिंग या ईपीओलॉउथ उठाया है

मैंने पाया है कि ईपीओएलएलयूपी केवल ईपीओएलएलआरआर के साथ संयोजन के साथ होता है, इसका कारण यह हो सकता है कि एपोल और लोवलवल आईओ के साथ अजगर इंटरफेस हो, आम तौर पर पुनः एक -1 वापस लौटा लेते हैं और ईएनएएनएन को गलत तरीके से सेट करते हैं गैर-अवरुद्ध recv पर कुछ भी उपलब्ध नहीं है, लेकिन अजगर EOF संकेत करने के लिए '' (कुछ नहीं लौटा) अजगर '' का उपयोग करता है।

आपका टेलनेट-सत्र बंद करने से केवल टीसीपी-कनेक्शन की समाप्ति बंद हो जाती है, इसलिए यह अभी भी पूरी तरह वैध है आपकी तरफ से बुलाए जाने के लिए, टीसीपी प्राप्त बफ़र्स में लंबित डेटा हो सकता है जो आपके आवेदन को अभी तक नहीं पढ़ा गया है ताकि कोई त्रुटि-स्थिति न हो।

ऐसा लगता है कि EPOLLIN और एक recv जो एक खाली स्ट्रिंग देता है, दूसरे छोर का संकेत है कि कनेक्शन को बंद कर दिया गया है, हालांकि, अजगर का एक पुराना संस्करण (एपोल से पहले पेश किया गया था) और एक पाइप पर सादे चयन का उपयोग करके, मैंने अनुभव किया है कि 'पढ़ा है कि लौटा' संकेत मिलता है कि ईओएफ केवल उपलब्ध डेटा की कमी है।


Comments

Popular posts from this blog

python - Overriding the save method in Django ModelForm -

html - CSS autoheight, but fit content to height of div -

qt - How to prevent QAudioInput from automatically boosting the master volume to 100%? -