मुझे एक बहुत ही परेशानी की समस्या है जिसे मैंने कई मंचों पर कई बार पाया लेकिन मुझे उचित समाधान नहीं मिला। समस्या rev() कनेक्शन के पिछले कुछ बाइट्स पर 0 देता है। यहां कुछ पृष्ठभूमि जानकारी दी गई है।recv() रिटर्न 0
- दोनों (क्लाइंट/सर्वर) अनुप्रयोग एक ही मशीन पर चलते हैं।
- दोनों (क्लाइंट/सर्वर) सॉकेट गैर-अवरुद्ध
- स्थानांतरित डेटा आकार 53 बाइट्स हैं।
- अंतिम()/recv() निष्पादित किए जाने पर दोनों (क्लाइंट/सर्वर) शट डाउन और क्लोजसेट को कॉल करते हैं।
- मैं भी SO_LINGER और 10 सेकंड, कोई सफलता या तो
मैं() कई बार (छोटे-छोटे टुकड़ों) भेजने के फोन के साथ और क्लाइंट साइड 53 बाइट्स स्थानांतरित कर रहे हैं से कोशिश की। सर्वर कई बार (4 बाइट अनुरोध) recv() को कॉल करता है और 49 बाइट्स पढ़ता है और फिर 0 (54 बाइट्स - 49 बाइट्स) देता है, इसलिए 4 बाइट गायब हैं)।
MSDN और कुछ मंचों गैर अवरुद्ध सॉकेट के लिए लिखें:
- recv() निश्चित रूप से रिटर्न < 0 त्रुटि और errno/WSAGetLastError पर
- recv (सेट किया गया है) निश्चित रूप से रिटर्न = 0 जब दूसरे पक्ष बंद कर दिया कनेक्शन
- recv() निश्चित रूप से देता है> 0 जब डेटा पढ़ा गया
MSDN भी कहते हैं:
एसडी_एसईएनडी या एसडीबीओओटी के साथ क्लोजसेट या शटडाउन फ़ंक्शंस का उपयोग नियंत्रण चैनल पर एक रिलीज सिग्नल भेजा जा रहा है। अलग-अलग सिग्नल और डेटा चैनलों के एटीएम के उपयोग के लिए , यह संभव है कि एक रिलीज सिग्नल डेटा के अंतिम गंतव्य तक पहुंचने से पहले रिमोट एंड तक पहुंच सकता है, जिसके परिणामस्वरूप उस डेटा का नुकसान होता है। एक संभावित समाधान पिछले डेटा के बीच पर्याप्त देरी प्रोग्रामिंग कर रहा है और एटीएम सॉकेट के लिए क्लोजसेट या शट डाउन फ़ंक्शन कॉल करता है।
यह) recv (के उदाहरण में माना जाता है और भेज(): http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx
लेकिन फिर भी कोई सफलता, मैं अभी भी कुछ बीच में आता है सभी कनेक्शनों का 10% में मिलता है 49 बाइट प्राप्त होने के बाद, 90 कनेक्शन का% सफल हो गया। कोई विचार? धन्यवाद।
मुझे लगता है कि आप कई क्लासिक सॉकेट प्रोग्रामिंग गलतियों में से एक बना रहे हैं। – selbie