2009-05-26 18 views
8

मैं जानना चाहता हूं कि निम्न परिदृश्य वास्तविक है या नहीं ?!गैर-अवरुद्ध सॉकेट पर चयन(), recv() और EWOULDBLOCK

  1. का चयन करें() (आरडी) पर गैर अवरुद्ध TCP सॉकेट का कहना है कि सॉकेट तैयार है
  2. recv() EWOULDBLOCK वापसी होगी कॉल के बावजूद चयन करने के लिए()

उत्तर

1

मैं एक लोकप्रिय डेस्कटॉप ऑपरेटिंग जहां O_NONBLOCK TCP सॉकेट, विशेष रूप से लूपबैक इंटरफेस पर चल रहे उन, कभी कभी से recv() के बाद select() रिपोर्ट सॉकेट पढ़ने के लिए तैयार है EAGAIN लौट सकते हैं में किसी त्रुटि के बारे में पता कर रहा हूँ। मेरे मामले में, दूसरी तरफ भेजने के बाद यह भेजता है।

अधिक जानकारी के लिए, मेरे ओकैमल नेटवर्क एप्लिकेशन पर्यावरण वितरण की एनएक्स लाइब्रेरी में t_nx.ml के लिए स्रोत कोड देखें। (link)

+1

लिंक टूटा हुआ लगता है – Thomas

+0

मजेदार, संपादन मेनू में, यह क्लिक करने योग्य है। : डी – thejh

2

यह संभव है के बाद, लेकिन केवल एक परिस्थिति में जहां आपके पास एक ही सॉकेट से पढ़ने की कोशिश कर रहे कई धागे/प्रक्रियाएं हैं।

+0

कि सुनने के लिए खुशी है कि:

इस प्रश्न देखें। मेरा आवेदन सिंगल थ्रेडेड है इसलिए मैं ठीक हूं। – mrvincenzo

4

recv() के लिए आपको EWOULDBLOCK के बजाय EAGAIN मिलेगा, और हाँ यह संभव है। जब से तुम सिर्फ तब select() साथ जाँच की है दो चीजों में से एक हुआ:

  • कुछ और (एक और धागा) select() और recv() के बीच इनपुट बफर सूखा गया है।
  • एक प्राप्त समय सॉकेट पर सेट किया गया था और यह डेटा प्राप्त किए बिना समाप्त हो गया था।
+0

टाइमआउट के मामले में, चुनें() 0 देता है इसलिए मैं इसके बारे में चिंतित नहीं हूं। – mrvincenzo

+3

# परिभाषित करें EWOULDBLOCK EAGAIN/* ऑपरेशन ब्लॉक करेगा */- कई ओएस – blaze

+0

पर पाया गया POSIX.1-2001 गैर-अवरुद्ध सॉकेट पर पढ़ने पर त्रुटियों को वापस करने की अनुमति देता है (और इसकी आवश्यकता नहीं है कि उनके पास समान हो मूल्य।) –

0

यह एक बहुप्रचारित वातावरण में संभव है जहां सॉकेट से दो धागे पढ़ रहे हैं। क्या यह एक बहुप्रचारित अनुप्रयोग है?

+0

यह एक सिंगल थ्रेडेड एप्लीकेशन है। – mrvincenzo

+0

भले ही 'चयन करें)' के लिए केवल पैरामीटर की बजाय सॉकेट पर टाइमआउट हो? क्या होगा यदि 'चयन() 'और' recv() 'के बीच टाइमआउट होता है? – dwc

+0

इस मामले में आपको यह व्यवहार नहीं दिखना चाहिए। – mikelong

0

यदि आप इस सॉकेट पर चयन() और recv() के बीच कोई अन्य सिस्कल नहीं कॉल करते हैं, तो recv() कभी भी EAGAIN या EWOULDBLOCK वापस नहीं आएगा।

मुझे नहीं पता कि आरईवी-टाइमआउट के साथ उनका क्या मतलब है, हालांकि, पॉज़िक्स मानक इसका उल्लेख नहीं करता है ताकि आप सुरक्षित कॉलिंग आरईवी() हो सकें।

0

हालांकि मेरा आवेदन एक एकल थ्रेडेड है, मैंने देखा कि वर्णित व्यवहार RHEL5 में असामान्य नहीं है। टीसीपी और यूडीपी सॉकेट दोनों जो O_NONBLOCK पर सेट किए गए थे (सेट किया गया एकमात्र सॉकेट विकल्प)। चयन करें() रिपोर्ट करता है कि सॉकेट तैयार है लेकिन निम्नलिखित recv() EAGAIN लौटाता है।

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