SocketAsyncEventArgs.BufferList
के साथ SendAsync का उपयोग करते समय विनिर्देशन बाइट्स की संख्या के बारे में क्या गारंटी देता है?
प्रारंभ करने के लिए, ईवेंट त्रुटियों पर उठाया जा सकता है, इस मामले में आप मान सकते हैं कि सभी बाइट्स स्थानांतरित नहीं किए गए हैं। इसके लिए आपको SocketEsyncEventArgs.SocketError को SocketError.Success के लिए परीक्षण करने की आवश्यकता है। साथ ही, यदि आप 'विनिर्देश' का संदर्भ लेते हैं तो मुझे लगता है कि आपका मतलब है (माइक्रोसॉफ्ट) विंडोज सॉकेट दस्तावेज (क्योंकि आप इसे SendAsync और अन्य विवरणों के लिए लिंक करते हैं)।
सफलता के मामले में पूर्ण घटना कहलाते समय दस्तावेज कहता है या हस्तांतरित बाइट्स की संख्या के लिए तात्पर्य है, हमें कुछ कदम उठाने पड़ते हैं। पहला कदम यह देखना है कि SendAsync ओवरलैप्ड I/O का उपयोग करता है या नहीं। Overlapped Input/Output दस्तावेज़ीकरण में उस प्रश्न का उत्तर दिया गया है। अंतर्निहित परिवहन प्रदाताओं के लिए इस तंत्र के लिए कार्यान्वयन अनिवार्य है और इसलिए यह एकमात्र ओवरलैप्ड I/O तंत्र है जो विंडोज सॉकेट के लिए उपलब्ध होने की गारंटी है। इस प्रकार, SendAsync को WSA_FLAG_OVERLAPPED विशेषता के साथ सॉकेट का उपयोग करने की गारंटी है।
ध्यान दें कि SendAsync reference implementation का निरीक्षण दर्शाता है कि SendAsync वास्तव में ओवरलैप I/O के साथ WSASend का उपयोग कर रहा है, लेकिन यह केवल एक अवलोकन है।
दूसरा चरण यह निर्धारित करना है कि ओवरलैप्ड I/O हमें स्थानांतरित बाइट्स की मात्रा से संबंधित पूर्ण घटना के संकेत के बारे में बताता है। इस स्थिति को कई स्थानों पर वर्णित किया गया है, उदाहरण के लिए इस Overlapped I/I and Event Objects पृष्ठ पर: 'बफर को खपत भेजे जाने पर संकेत प्रदान किया जाएगा'। [डब्लूएसएएसएंड] फ़ंक्शन के लिए टिप्पणी अनुभाग में थोड़ा और विवरण दिया गया है: 'एक पूरा संकेत होगा, जब एक बफर (ओं) परिवहन द्वारा उपभोग किया जाता है, तो एक नियमित वस्तु या घटना वस्तु की समाप्ति का आह्वान किया जाएगा। ।
यह अभी भी इस वाक्यांश की सटीक व्याख्या के लिए कुछ जगह छोड़ देता है।असल में यह कहता है कि डेटा सॉकेट स्कोप से अंतर्निहित परिवहन तंत्र द्वारा स्वीकार और पुष्टि की गई थी। इसका मतलब यह नहीं है कि यह रिमोट एंडपॉइंट प्रोटोकॉल परत पर पहुंचा है, यह संचार प्रोटोकॉल पर निर्भर करेगा। एक टीसीपी स्ट्रीमिंग सॉकेट के लिए मैं अनुमान लगाता हूं कि यह इंगित करता है कि डेटा रिमोट एंडपॉइंट पर पहुंचा है।
निष्कर्ष यह है कि दस्तावेज गारंटी (एक गैर-त्रुटि स्थिति के लिए) है कि SendAsync पूर्ण ईवेंट केवल उस बिंदु पर उठाया जाता है जब सभी बाइट स्थानांतरित किए जाते हैं।
स्रोत
2017-01-24 21:09:11
मुझे लगता है कि सवाल यह होगा: "क्या सॉकेट एसिंसेनएन्टएआरजी.कॉम्प्लेटेड हैंडलर को सॉकेट त्रुटि के बिना बुलाया जा सकता है और 'ई। बाइट्स ट्रांसफर! = लंबाई'?" जो मैं .NET Framework के तहत एकत्र कर सकता हूं उससे संभव नहीं है: http://stackoverflow.com/questions/28675811/when-i-call-wsasend-will-all-the-data-be-sent और http: // stackoverflow .com/प्रश्न/14347708/कॉलिंग-wsasend-in-complet-port – jorgebg
क्या आप परीक्षण के लिए कुछ कोड प्रदान कर सकते हैं? –
@DieterMeemken आपको जवाब देने के लिए परीक्षण करने की क्या आवश्यकता है _ विनिर्देश बनाने की गारंटी क्या है? जैसा कि मैंने उल्लेख किया है, मैं 'SendAsync' का उपयोग' SocketAsyncEventArgs' के साथ सेट 'बफर लिस्ट' के साथ कर रहा हूं। –