मैं जानना चाहता हूं कि निम्न परिदृश्य वास्तविक है या नहीं ?!गैर-अवरुद्ध सॉकेट पर चयन(), recv() और EWOULDBLOCK
- का चयन करें() (आरडी) पर गैर अवरुद्ध TCP सॉकेट का कहना है कि सॉकेट तैयार है
- recv() EWOULDBLOCK वापसी होगी कॉल के बावजूद चयन करने के लिए()
मैं जानना चाहता हूं कि निम्न परिदृश्य वास्तविक है या नहीं ?!गैर-अवरुद्ध सॉकेट पर चयन(), recv() और EWOULDBLOCK
मैं एक लोकप्रिय डेस्कटॉप ऑपरेटिंग जहां O_NONBLOCK
TCP सॉकेट, विशेष रूप से लूपबैक इंटरफेस पर चल रहे उन, कभी कभी से recv()
के बाद select()
रिपोर्ट सॉकेट पढ़ने के लिए तैयार है EAGAIN
लौट सकते हैं में किसी त्रुटि के बारे में पता कर रहा हूँ। मेरे मामले में, दूसरी तरफ भेजने के बाद यह भेजता है।
अधिक जानकारी के लिए, मेरे ओकैमल नेटवर्क एप्लिकेशन पर्यावरण वितरण की एनएक्स लाइब्रेरी में t_nx.ml
के लिए स्रोत कोड देखें। (link)
यह संभव है के बाद, लेकिन केवल एक परिस्थिति में जहां आपके पास एक ही सॉकेट से पढ़ने की कोशिश कर रहे कई धागे/प्रक्रियाएं हैं।
कि सुनने के लिए खुशी है कि:
इस प्रश्न देखें। मेरा आवेदन सिंगल थ्रेडेड है इसलिए मैं ठीक हूं। – mrvincenzo
recv()
के लिए आपको EWOULDBLOCK
के बजाय EAGAIN
मिलेगा, और हाँ यह संभव है। जब से तुम सिर्फ तब select()
साथ जाँच की है दो चीजों में से एक हुआ:
select()
और recv()
के बीच इनपुट बफर सूखा गया है।टाइमआउट के मामले में, चुनें() 0 देता है इसलिए मैं इसके बारे में चिंतित नहीं हूं। – mrvincenzo
# परिभाषित करें EWOULDBLOCK EAGAIN/* ऑपरेशन ब्लॉक करेगा */- कई ओएस – blaze
पर पाया गया POSIX.1-2001 गैर-अवरुद्ध सॉकेट पर पढ़ने पर त्रुटियों को वापस करने की अनुमति देता है (और इसकी आवश्यकता नहीं है कि उनके पास समान हो मूल्य।) –
यह एक बहुप्रचारित वातावरण में संभव है जहां सॉकेट से दो धागे पढ़ रहे हैं। क्या यह एक बहुप्रचारित अनुप्रयोग है?
यह एक सिंगल थ्रेडेड एप्लीकेशन है। – mrvincenzo
भले ही 'चयन करें)' के लिए केवल पैरामीटर की बजाय सॉकेट पर टाइमआउट हो? क्या होगा यदि 'चयन() 'और' recv() 'के बीच टाइमआउट होता है? – dwc
इस मामले में आपको यह व्यवहार नहीं दिखना चाहिए। – mikelong
यदि आप इस सॉकेट पर चयन() और recv() के बीच कोई अन्य सिस्कल नहीं कॉल करते हैं, तो recv() कभी भी EAGAIN या EWOULDBLOCK वापस नहीं आएगा।
मुझे नहीं पता कि आरईवी-टाइमआउट के साथ उनका क्या मतलब है, हालांकि, पॉज़िक्स मानक इसका उल्लेख नहीं करता है ताकि आप सुरक्षित कॉलिंग आरईवी() हो सकें।
हालांकि मेरा आवेदन एक एकल थ्रेडेड है, मैंने देखा कि वर्णित व्यवहार RHEL5 में असामान्य नहीं है। टीसीपी और यूडीपी सॉकेट दोनों जो O_NONBLOCK पर सेट किए गए थे (सेट किया गया एकमात्र सॉकेट विकल्प)। चयन करें() रिपोर्ट करता है कि सॉकेट तैयार है लेकिन निम्नलिखित recv() EAGAIN लौटाता है।
लिनक्स पर यह भी दस्तावेज है कि ऐसा हो सकता है, जैसा कि मैंने इसे पढ़ा है।
लिंक टूटा हुआ लगता है – Thomas
मजेदार, संपादन मेनू में, यह क्लिक करने योग्य है। : डी – thejh