में एंडियननेस और सॉकेट प्रोग्रामिंग मैं एक प्रोग्राम बना रहा हूं जो सी सॉकेट का उपयोग करके कुछ रोगी मॉनिटर के साथ संवाद करता है। मैं डिवाइस के साथ संवाद करने के लिए कनेक्शन-कम सॉकेट (यूडीपी) का उपयोग कर रहा हूं। लेकिन वहाँ है अपने कंप्यूटर और डिवाइस और अब तक मैं यह कर रहा था रोगी की निगरानी से पार्स प्रतिक्रिया प्राप्त करने के लिए के बीच endianness गलत मैच:सी
recvfrom(int socket, char *buffer, size_t length, int flags,
struct sockaddr *address, socklen_t *address_len);
तो मैं बफर कास्टिंग था सीधे संरचना करने और ntohs और ntohl का उपयोग कर , बाइट क्रम बदलने के लिए उदाहरण के लिए: इंटरनेट पर कुछ उदाहरण को पढ़ने के बाद
struct A * a = (struct A *)buffer;
Struct A b;
b.v1 = ntohs(a->v1);
b.v2 = ntohl(a->v2);
, मैं पता लगा इस संकलक निर्भर गद्दी की वजह से गलत दृष्टिकोण हो सकता है। लेकिन मुझे इसके बारे में निश्चित नहीं है। मुझे सही endiannes के साथ एक सी संरचना में एक बफर un-marshall करने के लिए सरल तरीका की जरूरत है। जो संरचना मैं प्राप्त कर रहा हूं वह अप्रत्याशित लंबाई और थोड़ा जटिल भी हो सकती है। मुझे गैर-मार्शलिंग करने के लिए तेज़ और आसान दृष्टिकोण चाहिए।
मैं प्रेषक को नियंत्रित नहीं करता हूं। प्रेषक नेटवर्क बाइट ऑर्डर में है। मेरा सवाल केवल यही है: - एक संरचना में बफर डालने के लिए सुरक्षित है और फिर इस संरचना की मेजबान-बाइट ऑर्डर प्रतिकृति बनाने के लिए इस जाली संरचना पर ntohs और ntohl का उपयोग करें? क्या यह सबसे तेज़ दृष्टिकोण है? यदि नहीं, तो सबसे तेज़ दृष्टिकोण क्या हो सकता है?
आप नियंत्रित करना प्रेषक भी? क्या वे नेटवर्क बाइट ऑर्डर में पैकेट भेजते हैं? – hroptatyr
मुझे लगता है कि आपका समाधान पहले से ही सही है, आप यह सुनिश्चित करने के लिए '__attribute __ ((पैक))' या 'गठबंधन (x)' का उपयोग कर सकते हैं कि संकलक आपकी संरचना को पैड नहीं करता है। – hroptatyr
वायर पर डेटा डालने और तार को बंद करते समय होस्ट ऑर्डर में कनवर्ट करते समय नेटवर्क बाइट ऑर्डर में कनवर्ट करें। –