2009-11-05 12 views
9

जब मैं सॉकेट के माध्यम से एक प्रक्रिया से दूसरे में एक पूर्णांक चर भेजता हूं, और फिर प्राप्त अंत में मान मुद्रित करता है, तो मूल्य ntohl/htonl का उपयोग किए बिना भी वही होता है, फिर कहां करें मुझे सॉकेट संरचनाओं को शुरू करने के अलावा इन कार्यों का उपयोग करने की आवश्यकता है। मैं लिट/बड़ा एंडियन समझता हूं। लेकिन जब पोर्ट वैल्यू रहता है तो हमें पोर्ट और आईपी नंबर को मेजबान/नेटवर्क बाइट ऑर्डर में बदलने की आवश्यकता क्यों होती है। कृपया विस्तार से समझाएं कि नेटवर्क पर पूर्णांक कैसे ट्रांफर किया गया है?htons में भ्रम- थोड़ा एंडियन/बड़ा एंडियन

उत्तर

16

आप अपने कार्यक्रम पोर्टेबल होने के लिए चाहते हैं, तो किसी भी समय आप एक पूर्णांक 1 बाइट से अधिक आकार में नेटवर्क पर भेजने के लिए, आप पहली बार htons या htonl का उपयोग कर बाइट क्रम नेटवर्क के परिवर्तित करना चाहिए, और प्राप्त कंप्यूटर बदलना होगा यह ntohs या ntohl का उपयोग करके बाइट ऑर्डर होस्ट करने के लिए।

आपके मामले में, मूल्य अभी भी वही है क्योंकि कारण कंप्यूटर और प्राप्तकर्ता कंप्यूटर एक ही अंतहीनता के कारण हैं। दूसरे शब्दों में, आपके द्वारा काम कर रहे कंप्यूटर और प्राप्तकर्ता कंप्यूटर दोनों छोटे एंडियन (या बड़े एंडियन, जो कुछ भी हो सकते हैं।)

लेकिन यदि आप चाहते हैं कि आपका प्रोग्राम पोर्टेबल हो, तो आप नहीं कर सकते हमेशा इस मामले पर भरोसा करते हैं। एक दिन, उदाहरण के लिए, प्रेषण कंप्यूटर इंटेल x86 हो सकता है, और प्राप्त करना एक सूर्य SPARC हो सकता है, और फिर यदि आप htons का उपयोग नहीं करते हैं तो आपका प्रोग्राम विफल हो जाएगा।

+0

मैंने क्लाइंट और सर्वर लिखा और htonl और ntohl का उपयोग नहीं किया। कहें जब मैंने 6 भेजा, सर्वर को 6 मान प्राप्त हुआ। फिर इन कार्यों की क्या ज़रूरत है? – avd

+5

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

+0

गैर-अभिन्न डेटा प्रकारों जैसे कि structs के बारे में क्या? क्या उनके पास अंतहीनता है? –

9

आप पॉवर प्रोसेसर के साथ एक मशीन के लिए एक x86 या amd64 मशीन से डेटा भेजने के लिए द्विआधारी प्रारूप में, चाहते हैं तो आप जल्दी से देखेंगे अपने डेटा "NUXI समस्या" का सामना करना पड़ता है कि के रूप में विभिन्न प्रोसेसर पूर्णांकों का इलाज अलग-अलग और बाइट्स को स्वैप करने के लिए दिखाई देते हैं। (वे वास्तव में बाइट्स को स्वैप नहीं करते हैं - वे सिर्फ एक अलग क्रम में उनके साथ काम करते हैं।)

x86 या amd64 पर काम करते समय, कम से कम महत्वपूर्ण बाइट स्मृति में पहली बार आता है (इस तरह आप से अतिरिक्त प्रदर्शन कर सकते हैं उच्च मेमोरी पते से कम)। पावरपीसी पहले सबसे महत्वपूर्ण बाइट मेमोरी में रखता है (इस तरह आप बाइट्स के आधार पर संख्याओं को सॉर्ट कर सकते हैं जो पहले मेमोरी में आते हैं - एक स्ट्रिंग सॉर्ट और एक इंटीजर सॉर्ट बिल्कुल वही हो सकता है।)

0

यह remaimns वही क्योंकि आपके आर्किटेक्चर पर नेटवर्क ऑर्डर देशी ऑर्डर जैसा ही है। यदि आप कभी भी किसी अन्य आर्किटेक्चर के लिए अपने कोड को संकलित करने की उम्मीद नहीं करते हैं तो आप hton/ntoh कॉल को छोड़ सकते हैं। तब आपका कोड पोर्टेबल नहीं होगा।

+1

यह सही नहीं है। वह अच्छी तरह से एक आर्किटेक्चर का उपयोग कर सकता है जहां होस्ट ऑर्डर नेटवर्क ऑर्डर से अलग है। आपका कोड htonX/ntohX के बिना 'काम' करेगा जब भी दोनों एंडपॉइंट्स की आर्किटेक्चर समान अंतहीनता होगी। –

+0

आप सही हैं - मेरा इरादा ऐसा कुछ कहना था लेकिन मेरे जवाब में बहुत स्पष्ट नहीं था। –

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