Unix Socket - Pesanan Byte Jaringan

Sayangnya, tidak semua komputer menyimpan byte yang terdiri dari nilai multibyte dalam urutan yang sama. Pertimbangkan internet 16-bit yang terdiri dari 2 byte. Ada dua cara untuk menyimpan nilai ini.

  • Little Endian - Dalam skema ini, byte orde rendah disimpan di alamat awal (A) dan byte orde tinggi disimpan di alamat berikutnya (A + 1).

  • Big Endian - Dalam skema ini, byte orde tinggi disimpan di alamat awal (A) dan byte orde rendah disimpan di alamat berikutnya (A + 1).

Untuk mengizinkan mesin dengan konvensi urutan byte yang berbeda berkomunikasi satu sama lain, protokol Internet menetapkan konvensi urutan byte kanonik untuk data yang dikirimkan melalui jaringan. Ini dikenal sebagai Network Byte Order.

Saat membuat sambungan soket Internet, Anda harus memastikan bahwa data dalam anggota sin_port dan sin_addr struktur sockaddr_in terwakili dalam Urutan Byte Jaringan.

Fungsi Pengurutan Byte

Rutinitas untuk mengubah data antara representasi internal host dan Network Byte Order adalah sebagai berikut -

Fungsi Deskripsi
htons () Host ke Jaringan Pendek
htonl () Host ke Jaringan Panjang
ntohl () Jaringan untuk Host Long
ntohs () Jaringan ke Host Pendek

Di bawah ini adalah beberapa detail lebih lanjut tentang fungsi-fungsi ini -

  • unsigned short htons(unsigned short hostshort) - Fungsi ini mengubah jumlah 16-bit (2-byte) dari urutan byte host ke urutan byte jaringan.

  • unsigned long htonl(unsigned long hostlong) - Fungsi ini mengubah jumlah 32-bit (4-byte) dari urutan byte host ke urutan byte jaringan.

  • unsigned short ntohs(unsigned short netshort) - Fungsi ini mengubah jumlah 16-bit (2-byte) dari urutan byte jaringan menjadi urutan byte host.

  • unsigned long ntohl(unsigned long netlong) - Fungsi ini mengubah jumlah 32-bit dari urutan byte jaringan menjadi urutan byte host.

Fungsi ini adalah makro dan menghasilkan penyisipan kode sumber konversi ke dalam program pemanggil. Pada mesin little-endian, kode akan mengubah nilai di sekitar urutan byte jaringan. Pada mesin big-endian, tidak ada kode yang dimasukkan karena tidak diperlukan; fungsi didefinisikan sebagai null.

Program untuk Menentukan Urutan Host Byte

Simpan kode berikut dalam file byteorder.c dan kemudian kompilasi dan jalankan melalui mesin Anda.

Dalam contoh ini, kami menyimpan nilai dua byte 0x0102 dalam bilangan bulat pendek dan kemudian melihat dua byte berturut-turut, c [0] (alamat A) dan c [1] (alamat A + 1) untuk menentukan byte memesan.

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

Output yang dihasilkan oleh program ini pada mesin Pentium adalah sebagai berikut -

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