2010-12-28 25 views
10

मैं इस तरह एक बाइट सरणी:यूडीपी के लिए सी ++ में सरणी कैसे विभाजित और जुड़ें?

lzo_bytep out; // my byte array 
size_t uncompressedImageSize = 921600; 

out = (lzo_bytep) malloc((uncompressedImageSize + 
      uncompressedImageSize/16 + 64 + 3)); 
wrkmem = (lzo_voidp) malloc(LZO1X_1_MEM_COMPRESS); 

// Now the byte array has 802270 bytes 
r = lzo1x_1_compress(imageData, uncompressedImageSize, 
     out, &out_len, wrkmem); 

मैं कैसे 65,535 बाइट्स से कम छोटे भागों में विभाजित कर सकते हैं यह (बाइट सरणी एक बड़ी छवि जो मैं करना चाहता हूँ यूडीपी जो ऊपरी सीमा 65,535 बाइट्स है पर भेज दिया) और फिर उन छोटे हिस्सों को एक निरंतर सरणी में वापस शामिल करें?

उत्तर

41

ऐसा करने के साथ समस्या यह है कि यूडीपी पैकेट बाहर आने या आदेश कर सकते हैं या गिरा दिया जाना है। इसके लिए टीसीपी का प्रयोग करें; यही वह है जो इसके लिए है।

+1

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

+23

@ रिचर्ड: आप ऐसे कनेक्शन को लागू करने में सक्षम नहीं होंगे जो यह सही ढंग से करता है जो टीसीपी की तुलना में किसी भी तेजी से संचालित करता है। शुरुआती बड़े हिस्से को भेजने के लिए एक टीसीपी कनेक्शन खोलें, और उसके बाद अपडेट के लिए यूडीपी का उपयोग करें, (यह मानते हुए कि यदि कोई भी अपडेट खो गया है या नष्ट हो गया है, तो आप इससे पुनर्प्राप्त कर सकते हैं; यूडीपी पैकेट खो या नष्ट हो सकते हैं)। यह गेम सर्वर है जो इस तरह की कम विलंबता की आवश्यकता है - यानी ध्वनि फाइलें और ऐसे में टीसीपी पर स्थानांतरित किया जाता है, लेकिन प्लेयर की स्थिति और ऐसे यूडीपी (यानी काउंटरस्ट्रिक सर्वर) पर प्रसारित होते हैं। –

+2

सिद्धांत में सच है। अभ्यास में कम। –

13

आपको "विभाजन" सरणी जरूरत नहीं है। आपको बस इसके विभिन्न हिस्सों में इंगित करना होगा।

आप एक विशिष्ट यूडीपी लिखने() फ़ंक्शन का उपयोग कर रहे मान लिया जाये कि, यह कई तर्क लेता है। उनमें से एक बफर के लिए एक सूचक है और दूसरा लंबाई है।

आप पहली बार 65535 बाइट्स प्राप्त करना चाहते हैं, तो अपने बफर wrkmem पर है और लंबाई 65535

दूसरा 65535 बाइट्स के लिए है, अपने बफर wrkmem + 65535 पर है और अपने लंबाई 65535

है तीसरे 65535 बाइट्स, अपने बफर wrkmem + 2 * 65535 पर है और अपने लंबाई 65535

यह जाओ है?

(जिसके अनुसार, अन्य पोस्टर सही हैं। आप टीसीपी का उपयोग कर होना चाहिए)।

दूसरी ओर, जब आप सरणी में फिर से जुड़ना चाहते हैं, तो आपको पूरी चीज़ के लिए पर्याप्त मेमोरी आवंटित करनी होगी, फिर आने वाली हिस्सों को उनकी सही स्थिति में कॉपी करने के लिए memcpy() जैसे प्रतिलिपि फ़ंक्शन का उपयोग करना होगा। याद रखें कि यूडीपी क्रम में टुकड़े नहीं दे सकता है और उन सभी को वितरित नहीं कर सकता है।

+1

+1 - निश्चित रूप से कोई पक्ष यह पता लगाने में सक्षम नहीं होगा कि कोई पैकेट ऑर्डर से बाहर आता है या पूरी तरह से गिरा दिया जाता है। इसलिए ओपी को इन कार्यों को सौंपने के लिए अपने स्वयं के तंत्र को लागू करने की आवश्यकता होगी। –

+13

चमकदार तरफ देखें: वह पॉइंटर अंकगणितीय के बारे में बहुत कुछ सीखेंगे जो अपने स्वयं के टीसीपी कार्यान्वयन को फिर से लागू करने की कोशिश कर रहा है। –

+1

यह एक अच्छा मुद्दा है ... हालांकि मुझे उम्मीद है कि यह मेरा चेकिंग खाता नहीं है, वह इस से वापस आ रहा है :) –

1

आप ØMQ जैसे संदेश आधारित मिडलवेयर को आजमा सकते हैं और पूरे संपीड़ित छवि को एक संदेश के रूप में फ़ीड कर सकते हैं और मिडलवेयर को असीमित रूप से चला सकते हैं और सबसे तेज गति से पुनः वितरण का प्रबंधन कर सकते हैं। यह एक बीएसडी सॉकेट संगत एपीआई प्रदान करता है और इसलिए कोड को माइग्रेट करना आसान हो सकता है और आपको आवश्यकतानुसार विभिन्न अंतर्निहित परिवहन प्रोटोकॉल के बीच आसानी से स्वैप करने की अनुमति देता है।

अन्य संदेश सिस्टम उपलब्ध हैं।

void my_free (void *data, void *hint) 
{ 
    free (data); 
} 

    /* ... */ 

size_t uncompressedImageSize = 921600, compressedImageSize = 0; 
size_t out_len = (uncompressedImageSize + uncompressedImageSize/16 + 64 + 3); 
lzo_bytep out = (lzo_bytep)malloc (out_len); 
lzo_voidp wkrmem = (lzo_voidp)malloc (LZO1X_1_MEM_COMPRESS); 
zmq_msg_t msg; 

rc = lzo1x_1_compress (imageData, uncompressedImageSize, 
         out, &compressedImageSize, wrkmem); 
assert (compressedImageSize > 0); 
rc = zmq_msg_init_data (&msg, out, compressedImageSize, my_free, NULL); 
assert (rc == 0); 
/* Send the message to the socket */ 
rc = zmq_send (socket, &msg, 0); 
assert (rc == 0); 
संबंधित मुद्दे