Socket 網絡字節順序
不幸的是,所有的計算機的字節存儲在相同的順序組成的多字節值。請考慮,是由2個字節的一個16位的基於整數。有兩種方法來存儲這個值。
Little Endian: 在這個方案中,低位字節存儲在起始地址(A)和高位字節存儲的下一個地址(A + 1).
Big Endian: 在這個方案中的高位字節的開始地址(A),並存儲在低位字節的下一個地址上存儲(A+1).
因此,不同字節順序的慣例,機器可以進行通信,互聯網協議指定一個規範的字節順序公約「在網絡上傳輸的數據。這被稱爲網絡字節順序。
建立因特網套接字連接時,必須確保域sin_port和sin_addr成員sockaddr_in結構中的數據在網絡字節順序表示。
字節排序功能:
主機的內部表示,網絡字節順序之間轉換數據的例程:
函數
描述
htons()
Host to Network Short
htonl()
Host to Network Long
ntohl()
Network to Host Long
ntohs()
Network to Host Short
下面是這些功能的更詳細:
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位數量從網絡字節順序轉換爲主機字節順序。
這些功能是在轉換的源代碼插入到調用程序中的宏和結果。在little-endian的機器代碼將改變周圍的值轉換爲網絡字節順序。在大端機器沒有插入代碼,因爲沒有需要的功能定義爲空(null).
程序來確定主機字節順序:
請將下面的代碼在一個文件byteorder.c和,然後在機器上編譯並運行它。
在這個例子中,我們兩個字節值0x0102儲存在短整型,然後看看在連續兩個字節,c[0](地址)和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
$>