2010-11-16 16 views
5

मैं एक नेटवर्किंग एप्लिकेशन लिख रहा हूं जो एक ही रिमोट/लोकेल एंडपॉइंट जोड़ी के बीच भेजने और प्राप्त करने के लिए एएसआईओ/यूडीपी का उपयोग करता है। मैंने 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 का उपयोग करके होता है। मैं अभी तक विंडोज़ में कोशिश करने में सक्षम नहीं हूं।

+3

शायद आप एक और पूर्ण उदाहरण पोस्ट कर सकते हैं, आपके विवरण से यह कहना मुश्किल है कि क्या गलत हो सकता है, मैंने udp सॉकेट के साथ 'boost :: asio :: async_read' का उपयोग किया है और इसमें पैकेट ड्रॉप करने में कोई समस्या नहीं है ... – Nim

+1

जैसा कि निम ने कहा था, आपको एक बेहतर विचार देने के लिए आपको और कोड पोस्ट करना चाहिए कि आपका प्रोग्राम किस प्रकार संरचित है। –

उत्तर

2

सामान्य विचार यह है कि आपके कार्यक्रम को सॉकेट पर कुछ समय देने के लिए सॉकेट पर इंतजार करना चाहिए, या तो यूडीपी में अवरुद्ध या अधिसूचना के लिए io_service में प्रतीक्षा कर रहा है कि सॉकेट को असीमित रूप से कुछ प्राप्त हुआ है। पैकेट प्राप्त करने के लिए ओएस में सॉकेट के पास एक छोटा बफर है, इससे बचने का कोई तरीका नहीं है। इसलिए समस्या यह है कि आपका प्रोग्राम कैसा व्यवहार कर रहा है।

  • क्या आपका धागा कहीं भी है लेकिन ASIO io_service के भीतर है? यदि ऐसा है तो आप किसी भी अंतर्निहित सॉकेट बफर को आसानी से बह सकते हैं।
  • क्या आप साबित कर सकते हैं कि औसतन, कॉलिंग ब्लॉक के बीच बिताए गए समय पैकेट के बीच के समय से कम है?
  • आपको सॉकेट से डेटा प्राप्त करने के बाद फिर से async_receive को कॉल करना होगा। उदाहरण के लिए आप अपने प्राप्त हैंडलर के भीतर से एक और async_receive जारी कर सकते हैं।
+1

जिस कारण से मैंने इसे उत्तर के रूप में चिह्नित किया है वह यह है कि त्रुटि पीईबीकेएसी त्रुटि (कीबोर्ड और चेयर के बीच समस्या मौजूद है) के रूप में सामने आई है। कोड के कुछ हिस्सों को विभिन्न धागे में किया जा रहा था और जब डेटा बहुत जल्दी पहुंच रहा था, तो मैं लिख रहा था। मैंने एक संक्षिप्त उदाहरण के साथ आने की कोशिश करते समय यह खोजा - और उदाहरण में त्रुटि प्रदर्शित नहीं हुई। – Jonathan

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