2012-07-20 13 views
5

के साथ प्राप्त कैसे विभाजित करें मैंने अपने यूडीपी सर्वर और क्लाइंट को boost :: asio udp सॉकेट के साथ बनाया है। इससे पहले कि मैंने अधिक डेटाग्राम भेजना शुरू किया, सब कुछ अच्छा लग रहा था। वे क्लाइंट से सर्वर पर सही ढंग से आते हैं। लेकिन, वे मेरे बफर में एक संदेश में एकजुट हैं।बूस्ट एएसआईयू udp सॉकेट संयुक्त डेटाग्राम

मैं

udp::socket::async_receive का उपयोग std::array<char, 1 <<18> बफर

साथ async अनुरोध करने के लिए। और कॉलबैक

void on_receive(const error_code& code, size_t bytes_transferred)

के माध्यम से डाटा प्राप्त होता है मैं भी अक्सर (हर 10 मिलीसेकंड) डेटा भेजने मैं कई डाटाग्राम ऊपर कॉलबैक के साथ अपने बफर में एक साथ प्राप्त करते हैं। सवाल यह है कि कैसे अलग उन्हें अलग करें? नोट: मेरे यूडीपी डेटाग्राम में परिवर्तनीय लंबाई है। मैं आकार के साथ अतिरिक्त हेडर का उपयोग नहीं करना चाहता, क्योंकि यह तीसरे पक्ष के डेटाग्राम के लिए मेरा कोड बेकार कर देगा।

+0

क्या आप अपना कोड दिखा सकते हैं? –

+0

अपने 'on_receive' संदेश में उपयोगकर्ता द्वारा प्रदत्त कॉलबैक फ़ंक्शन का उपयोग करें, जो एकल प्राप्त पैकेट में सभी शामिल संदेशों को संसाधित करता है। – Chad

+0

निश्चित रूप से, यह यहां पाया जा सकता है: [udp2tcp_tunnel] (https://github.com/valery-l/udp2tcp_tunnel)। यह प्रगति पर है - अभी तक एक छोटा पिंग-पोंग सर्वर (क्लाइंट से टीसीपी द्वारा भेजना, यूडीपी द्वारा सर्वर से एक ही परीक्षण संदेश प्राप्त करना)। ऐसा लगता है कि मुझे समस्या मिली। यदि मैं ** बफर अनुक्रम ** में कई बफर भेजता हूं, तो 'basic_datagram_socket :: async_send_to (buffer_sequence, हैंडलर)' ​​द्वारा, यह ** एक ** डेटाग्राम (** ** ** ** ** प्रत्येक बफर के लिए डेटाग्राम नहीं होगा * *)। –

उत्तर

0

मुझे विश्वास है कि यह बढ़ावा देने के तरीके में एक सीमा है :: एएसओ स्टेटलेस डेटा धाराओं को संभालती है। सीरियल इंटरफ़ेस के लिए boost :: asio का उपयोग करते समय मैंने बिल्कुल वही व्यवहार देखा। जब मैं उनके बीच अपेक्षाकृत बड़े अंतर के साथ पैकेट भेज रहा था, तो मैं प्रत्येक को एक अलग कॉलबैक में प्राप्त कर रहा था। चूंकि पैकेट आकार बढ़ गया और इसलिए पैकेट के बीच का अंतर कम हो गया, यह एक चरण तक पहुंच गया जब यह केवल एक ही पैकेट की प्राप्ति के बाद बफर भरने पर कॉलबैक निष्पादित करेगा।

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

यदि आपकी भीड़ कई अलग-अलग पैकेट प्रकारों को प्रेषित करने से आ रही है, तो आप सही आकार बफर को पूर्व-आवंटित नहीं कर सकते हैं, तो आप संभावित रूप से प्रत्येक प्रकार के लेनदेन के लिए विभिन्न बंदरगाहों पर विभिन्न सॉकेट बना सकते हैं। यह थोड़ी अधिक "हैकी" है, लेकिन जब तक आप 20,000 विभिन्न पैकेट प्रकारों का उपयोग नहीं कर रहे हैं, तब तक तात्कालिक बंदरगाह उपलब्धता की असीमित प्रकृति को देखते हुए, जो शायद आपको अच्छी तरह से मदद करेगा।

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