2010-03-04 11 views
7

मैं प्रोग्रामिंग और एएसपी नेटवर्क प्रोग्रामिंग में बहुत नया हूं इसलिए अगर यह बेवकूफ है, तो कृपया बहुत मुश्किल से परेशान न करें, धन्यवाद।यूडीपी और सॉकेट, रिकवर() लौटने -1 और संसाधन अस्थायी रूप से अनुपलब्ध

मेरे पास क्लाइंट और सर्वर सी में आरेख (यूडीपी) के साथ संचार कर रहा है। क्लाइंट 5 संदेश भेजता है और संदेश प्राप्त करने पर, सर्वर संदेश भेजता है। संदेश प्राप्त करना और भेजना तब तक बढ़िया है जब तक कि क्लाइंट ने संदेश प्राप्त नहीं कर लिया हो। सर्वर के बाद सभी संदेश वापस भेजने के बाद, यह बंद() का उपयोग कर समाप्त होता है। तो ग्राहक से recvfrom() 0 वापस करना चाहिए, है ना?

मानते हैं कि सर्वर से तरफ() को 0 (0) को बंद कर देना चाहिए, यह त्रुटि -1 अस्थायी रूप से अनुपलब्ध है। सर्वर से बंद सॉकेट के लिए यह संसाधन संदर्भ है? या यह बफर या कुछ से बाहर चलने की तरह कुछ और पूरी तरह से अलग है (जो मुझे नहीं लगता सच है)?

और मेरी धारणा यह सोचते हैं गलत था और -1 दिया जाता है क्योंकि सर्वर समाप्त, मैं शायद

if(SOMEMACRO) 
    do something 

साथ त्रुटि संभाल चाहिए, लेकिन मैं यह कैसे पता कि क्या SOMEMACRO है? मैं त्रुटि को मुद्रित करता हूं लेकिन यह कहता है कि संसाधन अस्थायी अनुपलब्ध है और recvfrom() विवरण अनावश्यक संसाधन के बारे में उल्लेख नहीं है ..?

बीटीडब्ल्यू यह एक गैर-अवरुद्ध सॉकेट है, अगर इससे कोई फर्क पड़ता है क्योंकि मैंने पढ़ा है कि यदि O_NONBLOCK सेट है और कोई संदेश उपलब्ध नहीं है, तो यह EAGAIN या EWOULDBLOCK में त्रुटि सेट करेगा। O_NONBLOCK सेट नहीं है लेकिन MSG_DONTWAIT सेट है। क्या वे मूल रूप से वही बात हैं जहां O_NONBLOCK सामान्य फ़ाइल वर्णनकर्ताओं के लिए है और MSG_DONTWAIT सॉकेट विशिष्ट है ??

मेरा दिमाग अब इतना अच्छा काम नहीं कर रहा है, अगर कोई मुझे प्रबुद्ध कर सकता है और स्पष्टीकरण देता है कि मेरा भ्रम क्या है, तो मैं इसकी सराहना करता हूं। धन्यवाद!

उत्तर

13

यूडीपी, एक राज्यविहीन प्रोटोकॉल है टीसीपी जो कनेक्शन उन्मुख है के विपरीत है। आपका प्राप्तकर्ता कोड यह नहीं जान पाएगा कि प्रेषक ने अपनी सॉकेट बंद कर दी है या नहीं, यह केवल यह जानता है कि डेटा पढ़ने के लिए प्रतीक्षा कर रहा है या नहीं। लिनक्स पर recvfrom के लिए आदमी पृष्ठ के अनुसार:

कोई संदेश सॉकेट में उपलब्ध हैं, तो प्राप्त संदेश के आने का कॉल जब तक सॉकेट nonblocking है प्रतीक्षा करें, (fcntl देख (2)) जो मामले में मान -1 वापस कर दिया गया है और बाह्य परिवर्तनीय इरनो EAGAIN पर सेट है।

यह वही है के लिए आप

संपादित हो रहा है लगता है: ध्यान दें कि "संसाधन अस्थायी रूप से अनुपलब्ध" और EAGAIN वही त्रुटि कर रहे हैं, एक बस उपयोगकर्ता के अनुकूल descption बनाम परिभाषित नाम है।असल में यह सिर्फ आपको बता रहा है कि आप सॉकेट से पढ़ने की कोशिश कर रहे हैं और

+1

पढ़ने के लिए कोई डेटा नहीं है, तो यदि आप यूडीपी का उपयोग कर रहे हैं, तो क्या कभी भी 0 वापस लौटाएगा? चूंकि आप कभी नहीं जानते कि सहकर्मी ने व्यवस्थित शट डाउन किया है या नहीं? –

+2

@ फैंटास्टिक फूरियर - यूडीपी वास्तव में एक डाटाग्राम भेज सकता है जो सिर्फ आईपी और यूडीपी हेडर है लेकिन कोई डेटा पेलोड नहीं है। यह पूरी तरह से कानूनी है और 0 बाइट्स के पढ़ने की तरह आपको देखेगा। – Duck

+0

@ फैंटास्टिक फूरियर - कड़ाई से बोलते हुए यूडीपी में कोई "कनेक्शन" नहीं है, वहां बंद करने, व्यवस्थित या अन्यथा कुछ भी नहीं है। – Duck

2

सॉकेट बंद करने के बाद भी यह कुछ समय के लिए अभी भी घूमता है। आमतौर पर लगभग दो मिनट या तो। इससे बचने के लिए, SO_REUSEADDR सॉकेट विकल्प का उपयोग करें।

यहां आपके लिए कुछ संदर्भ दिए गए हैं।

http://msdn.microsoft.com/en-us/library/ms740476%28VS.85%29.aspx http://docs.hp.com/en/B2355-90136/ch03s01.html

और यहाँ एक उदाहरण है, समारोह udp_listen के लिए नीचे स्क्रॉल:

http://www.codase.com/search/display?file=L2dlbnRvbzIvdmFyL3RtcC9yZXBvcy9jb2Rhc2UuYy9zbGlycC0xLjAuMTYvd29yay9zbGlycC0xLjAuMTYvc3JjL3VkcC5j&lang=c&off=15730+15796+

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