मैं एक नेटवर्किंग एप्लिकेशन लिख रहा हूं जो एक ही रिमोट/लोकेल एंडपॉइंट जोड़ी के बीच भेजने और प्राप्त करने के लिए एएसआईओ/यूडीपी का उपयोग करता है। मैंने udp :: सॉकेट :: डेटा प्राप्त करने के लिए प्राप्त किया था और मेरे कोड में सब कुछ तार्किक रूप से काम किया था, लेकिन मैं पैकेट की एक बड़ी संख्या खो रहा था। जो मैंने पाया वह यह था कि प्राप्त समारोह पर अवरुद्ध नहीं होने पर प्राप्त कोई भी पैकेट खो गया था - यह बफरिंग नहीं कर रहा था। यह विशेष रूप से अजीब था, क्योंकि मैं निम्न आदेश का उपयोग कर 2 एमबी करने के लिए प्राप्त बफर निर्धारित किया था:बूस्ट एएसआईओ बफरिंग काम नहीं कर रहा
sock_udp.connect(remote_endpoint);
sock_udp.set_option(boost::asio::socket_base::receive_buffer_size(2*1024*1024));
यह और तथ्य यह है कि अगर मैं के बारे में 100 बाइट्स के केवल दो पैकेट भेजा प्रत्येक मैं अभी भी एक दूसरे अगर मैं खो देगा किसी भी समय पहली बार प्रसंस्करण खर्च किया।
मुझे लगा कि यह शायद udp :: सॉकेट :: प्राप्त करने के साथ एक दोष था, इसलिए मैंने udp::socket::async_receive
का उपयोग करने के लिए अपने नेटवर्किंग कोड को फिर से लिखा लेकिन मुझे अभी भी एक ही समस्या है। यही है, एक बार मेरे हैंडलर को बुलाया जाता है, जब तक मैं async_receive को दोबारा कॉल नहीं करता तब तक मैं किसी भी पैकेट को छोड़ देता हूं।
क्या मैं मूल रूप से कुछ गलत समझ रहा हूं? क्या आने वाले पैकेट बफर को बढ़ावा देने के लिए मुझे एक अलग दृष्टिकोण का उपयोग करना चाहिए?
यदि यह मदद करता है, तो मैंने सत्यापित किया है कि यह एक्ससीडी में ओएस एक्स में उनके कस्टम जीसीसी 4.2 बिल्ड, साथ ही उबंटू 10.10 का उपयोग कर gcc4.5 का उपयोग करके होता है। मैं अभी तक विंडोज़ में कोशिश करने में सक्षम नहीं हूं।
शायद आप एक और पूर्ण उदाहरण पोस्ट कर सकते हैं, आपके विवरण से यह कहना मुश्किल है कि क्या गलत हो सकता है, मैंने udp सॉकेट के साथ 'boost :: asio :: async_read' का उपयोग किया है और इसमें पैकेट ड्रॉप करने में कोई समस्या नहीं है ... – Nim
जैसा कि निम ने कहा था, आपको एक बेहतर विचार देने के लिए आपको और कोड पोस्ट करना चाहिए कि आपका प्रोग्राम किस प्रकार संरचित है। –