前言
我們知道,資料在主機內的存放有兩種模式,也就是說,主機位元組序有兩種:大端和小端( 這裡假定讀者已經清楚這個問題 )。但在網路通訊中,要求通訊資料( 通訊資料這裡指IP號和埠號 )的使用必須用網路位元組序。什麼又是網路位元組序?
網路位元組序可以理解為主機位元組序的大端模式。如果你的主機位元組序原本就是大端模式,那麼你可以考慮不用將通訊資料轉換為網路位元組序;但如果你的主機位元組序是小端,那麼通訊資料必須被下面提及到的其中某個函式進行處理,轉換成網路位元組序後方可使用( 即存放進套接字地址結構變數 )。
檢視主機位元組序
執行下面一段小程式即可檢視你的主機位元組序( 註釋略 )
1 #include <stdio.h> 2 3 int main(int argc, char **argv) 4 { 5 union { 6 short s; 7 char c[sizeof(short)]; 8 } un; 9 10 un.s = 0x0102; 11 if (un.c[0] == 1 && un.c[1] == 2) { 12 puts("位元組序為小端"); 13 } 14 else if (un.c[0] == 2 && un.c[1] == 1) { 15 puts("位元組序為大端"); 16 } 17 else { 18 puts("位元組序未知"); 19 } 20 21 return 0; 22 }
本機執行情況:
轉換函式
以下幾個轉換函式均包含在標頭檔案 netinet/in.h 中
1. uint16_t htons ( uint16_t host16bitvalue )
將16位的主機位元組序無符號整型變數轉換為網路位元組序格式
2. uint32_t htonl ( uint32_t host32bitvalue )
將32位的主機位元組序無符號整型變數轉換為網路位元組序格式
3. uint16_t ntohs ( uint16_t net16bitvalue )
將16位的網路位元組序無符號整型變數轉換為主機位元組序格式
4. uint32_t ntohl ( uint32_t net32bitvalue )
將32位的網路位元組序無符號整型變數轉換為主機位元組序格式
說明
以上函式中" h "代表主機位元組序;" n "代表網路位元組序;" s "代表16位的無符號整型變數( 往往是埠 );" l “代表32位的無符號整型變數( 往往是Ipv4地址 )。