Unix Soketi - Ağ Bayt Siparişleri

Ne yazık ki, tüm bilgisayarlar çok baytlı bir değer içeren baytları aynı sırayla depolamaz. 2 bayttan oluşan 16 bitlik bir internet düşünün. Bu değeri saklamanın iki yolu vardır.

  • Little Endian - Bu şemada, düşük değerli bayt başlangıç ​​adresinde (A) saklanır ve yüksek sıralı bayt sonraki adreste (A + 1) saklanır.

  • Big Endian - Bu şemada, yüksek dereceli bayt başlangıç ​​adresinde (A) ve düşük sıralı bayt bir sonraki adreste (A + 1) saklanır.

Farklı bayt sırası kurallarına sahip makinelerin birbirleriyle iletişim kurmasına izin vermek için İnternet protokolleri, ağ üzerinden iletilen veriler için kanonik bir bayt sırası kuralı belirler. Bu, Ağ Bayt Sırası olarak bilinir.

İnternet soket bağlantısı kurarken sockaddr_in yapısının sin_port ve sin_addr üyelerindeki verilerin Ağ Bayt Sırasında temsil edildiğinden emin olmalısınız.

Bayt Sıralama İşlevleri

Bir ana bilgisayarın dahili gösterimi ile Ağ Bayt Sırası arasında veri dönüştürme rutinleri aşağıdaki gibidir -

Fonksiyon Açıklama
htons () Host to Network Short
htonl () Ağda Uzun
ntohl () Uzun Barındırılacak Ağ
ntohs () Kısa Barındırma Ağı

Aşağıda bu işlevler hakkında biraz daha ayrıntı listelenmiştir -

  • unsigned short htons(unsigned short hostshort) - Bu işlev 16 bitlik (2 bayt) miktarları ana bilgisayar bayt sırasından ağ bayt sırasına dönüştürür.

  • unsigned long htonl(unsigned long hostlong) - Bu işlev 32 bitlik (4 bayt) miktarları ana bilgisayar bayt sırasından ağ bayt sırasına dönüştürür.

  • unsigned short ntohs(unsigned short netshort) - Bu işlev 16 bitlik (2 bayt) miktarları ağ bayt sırasından ana bilgisayar bayt sırasına dönüştürür.

  • unsigned long ntohl(unsigned long netlong) - Bu işlev, 32 bitlik miktarları ağ bayt sırasından ana bilgisayar bayt sırasına dönüştürür.

Bu işlevler makrolardır ve dönüştürme kaynak kodunun çağıran programa eklenmesiyle sonuçlanır. Küçük endian makinelerde kod, değerleri ağ bayt sırasına göre değiştirecektir. Big-endian makinelerde, gerekli olmadığı için hiçbir kod girilmez; işlevler boş olarak tanımlanır.

Ana Bilgisayar Bayt Sırasını Belirleme Programı

Aşağıdaki kodu bir byteorder.c dosyasında saklayın ve ardından onu derleyin ve makinenizde çalıştırın.

Bu örnekte, iki baytlık değeri 0x0102'yi kısa tamsayıda saklıyoruz ve ardından baytı belirlemek için ardışık iki bayta, c [0] (A adresi) ve c [1] 'e (A + 1 adresi) bakıyoruz. sipariş.

#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);
}

Bu program tarafından bir Pentium makinesinde oluşturulan bir çıktı aşağıdaki gibidir -

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