यूनिक्स सॉकेट - नेटवर्क बाइट ऑर्डर

दुर्भाग्य से, सभी कंप्यूटर बाइट्स को संग्रहीत नहीं करते हैं जिसमें एक ही क्रम में एक मल्टीबाइट मान शामिल होता है। एक 16-बिट इंटरनेट पर विचार करें जो 2 बाइट्स से बना है। इस मान को संग्रहीत करने के दो तरीके हैं।

  • Little Endian - इस योजना में, कम-ऑर्डर बाइट को शुरुआती पते (ए) पर संग्रहीत किया जाता है और उच्च-क्रम बाइट को अगले पते (ए + 1) पर संग्रहीत किया जाता है।

  • Big Endian - इस योजना में, उच्च-क्रम बाइट को शुरुआती पते (ए) पर और निम्न-ऑर्डर बाइट को अगले पते (ए + 1) पर संग्रहीत किया जाता है।

अलग-अलग बाइट ऑर्डर कन्वेंशन वाली मशीनों को एक-दूसरे के साथ संवाद करने की अनुमति देने के लिए, इंटरनेट प्रोटोकॉल नेटवर्क पर प्रसारित डेटा के लिए एक कैनोनिकल बाइट ऑर्डर सम्मेलन निर्दिष्ट करते हैं। इसे नेटवर्क बाइट ऑर्डर के रूप में जाना जाता है।

इंटरनेट सॉकेट कनेक्शन की स्थापना करते समय, आपको यह सुनिश्चित करना चाहिए कि sockaddr_in संरचना के sin_port और sin_addr सदस्यों में डेटा नेटवर्क बाइट ऑर्डर में दर्शाया गया है।

बाइट ऑर्डरिंग फ़ंक्शंस

एक मेजबान के आंतरिक प्रतिनिधित्व और नेटवर्क बाइट ऑर्डर के बीच डेटा परिवर्तित करने के लिए रूट निम्नानुसार हैं -

समारोह विवरण
htons () नेटवर्क शॉर्ट को होस्ट करें
htonl () नेटवर्क लॉन्ग को होस्ट करें
ntohl () नेटवर्क लंबे होस्ट करने के लिए
ntohs () नेटवर्क टू होस्ट शॉर्ट

नीचे सूचीबद्ध इन कार्यों के बारे में कुछ और विवरण हैं -

  • unsigned short htons(unsigned short hostshort) - यह फ़ंक्शन होस्ट बाइट ऑर्डर से नेटवर्क बाइट ऑर्डर तक 16-बिट (2-बाइट) मात्रा में कनवर्ट करता है।

  • unsigned long htonl(unsigned long hostlong) - यह फ़ंक्शन होस्ट बाइट ऑर्डर से 32-बिट (4-बाइट) मात्रा को नेटवर्क बाइट ऑर्डर में कनवर्ट करता है।

  • unsigned short ntohs(unsigned short netshort) - यह फ़ंक्शन नेटवर्क बाइट ऑर्डर से 16-बिट (2-बाइट) मात्रा को बाइट ऑर्डर को होस्ट करता है।

  • unsigned long ntohl(unsigned long netlong) - यह फ़ंक्शन बाइट ऑर्डर को होस्ट करने के लिए नेटवर्क बाइट ऑर्डर से 32-बिट मात्रा में कनवर्ट करता है।

ये फ़ंक्शन मैक्रोज़ हैं और परिणामस्वरूप कॉलिंग प्रोग्राम में रूपांतरण स्रोत कोड को सम्मिलित करते हैं। छोटे-एंडियन मशीनों पर, कोड नेटवर्क बाइट ऑर्डर के आसपास मूल्यों को बदल देगा। बड़े-एंडियन मशीनों पर, कोई भी कोड नहीं डाला गया है क्योंकि किसी को भी ज़रूरत नहीं है; कार्यों को शून्य के रूप में परिभाषित किया गया है।

होस्ट बाइट ऑर्डर निर्धारित करने का कार्यक्रम

एक फ़ाइल byteorder.c में निम्न कोड रखें और फिर इसे संकलित करें और इसे अपनी मशीन पर चलाएं।

इस उदाहरण में, हम दो-बाइट मान 0x0102 को लघु पूर्णांक में संग्रहीत करते हैं और फिर बाइट को निर्धारित करने के लिए दो लगातार बाइट्स, c [0] (पता A) और c [1] (पता A + 1) को देखते हैं। गण।

#include <stdio.h>

int main(int argc, char **argv) {

   union {
      short s;
      char c[sizeof(short)];
   }un;
	
   un.s = 0x0102;
   
   if (sizeof(short) == 2) {
      if (un.c[0] == 1 && un.c[1] == 2)
         printf("big-endian\n");
      
      else if (un.c[0] == 2 && un.c[1] == 1)
         printf("little-endian\n");
      
      else
         printf("unknown\n");
   }
   else {
      printf("sizeof(short) = %d\n", sizeof(short));
   }
	
   exit(0);
}

पेंटियम मशीन पर इस कार्यक्रम द्वारा उत्पन्न एक आउटपुट निम्नानुसार है -

$> gcc byteorder.c
$> ./a.out
little-endian
$>