2011-12-01 21 views
5

पर बड़े डेटा भेजें मुझे udp का उपयोग करके बहुत बड़ा डेटा भेजने और प्राप्त करने की आवश्यकता है। दुर्भाग्य से udp प्रति आरेख 8192 बाइट प्रदान करता है, इसलिए डेटा को छोटे टुकड़ों में विभाजित करने की आवश्यकता होती है। मैं क्यूटी और QUdpSocket का उपयोग कर रहा हूं। 921600 की लंबाई के साथ QByteArray है जो मैं क्लाइंट को भेजना चाहता हूं। मैं हर बार 8192 बाइट भेजना चाहता हूं।यूडीपी सॉकेट

QByteArray को विभाजित करने का तेज़ तरीका क्या है?

+1

मुझे एक ही समस्या है। हालांकि, मुझे संदेह है कि यदि मैं डेटा विभाजित करता हूं और टुकड़े भेजता हूं, तो क्या मैं दूसरी तरफ सभी टुकड़े इकट्ठा कर सकता हूं और मूल बाइट सरणी वापस प्राप्त कर सकता हूं? क्या मुझे प्रत्येक डेटाग्राम आदि पर कुछ संख्या डालने की ज़रूरत है ?? –

उत्तर

3

start से शुरू होने वाली len की QByteArray प्राप्त करने के लिए आप QByteArray.mid(int start, int len) विधि (see documentation here) का उपयोग कर सकते हैं।

बस len अपने आंकड़ारेख आकार बनाने के लिए और शुरू के साथ 0*len, 1*len, 2*len, ... सब कुछ भेज दिया जाता है जब तक।

5

आपको डेटा को स्पष्ट रूप से विभाजित करने की आवश्यकता नहीं है, बस एक बार में 8 केबी के माध्यम से कदम उठाएं। आम तौर पर एक सॉकेट में डेटा लिखने वाले फ़ंक्शन (QUdpSocket::writeDatagram सहित, ऐसा लगता है) पहले बाइट और बाइट गिनती के लिए एक पॉइंटर स्वीकार करते हैं, ताकि आप सरणी में केवल पॉइंटर प्रदान कर सकें।

ध्यान दें कि 8 केबी डेटाग्राम भेजना काफी आक्रामक है; वे आईपी परत पर fragmented होने की संभावना है जो वितरण की गति और विश्वसनीयता को नकारात्मक रूप से प्रभावित कर सकता है।

"पथ MTU" की अवधारणा का अनुसंधान करें, और भेजने के लिए इसका उपयोग करने का प्रयास करें, यह तेज़ हो सकता है हालांकि इसके परिणामस्वरूप अधिक डेटाग्राम होंगे।

4

असल में यूडीपी हेडर पर लम्बाई क्षेत्र 16 बिट्स है, इसलिए यूडीपी डेटाग्राम ~ 65k तक हो सकता है (हेडर स्टफ के आकार से कम)।

हालांकि, जैसा कि अनचाहे इंगित किया गया है, यह गंतव्य के रास्ते पर सबसे छोटे एमटीयू फिट करने के तरीके के साथ खंडित किया जाएगा।

8192 बाइट्स विंडोज ऑपरेटिंग सिस्टम के लिए डिफ़ॉल्ट प्राप्त बफर आकार है। यदि आप ईथरनेट का उपयोग कर रहे हैं तो एमटीयू likely 1500 bytes है। इससे भी बड़ा यूडीपी डेटाग्राम खंडित किया जाएगा। यदि आपका डेटाग्राम मार्ग के साथ एक छोटे से एमटीयू के साथ एक डिवाइस का सामना करता है, तो इसे फिर से खंडित किया जाएगा।

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