htons

htons

htons是將整型變數從主機位元組順序轉變成網路位元組順序,就是整數在地址空間存儲方式變為高位位元組存放在內存的低地址處。

網路位元組順序是TCP/IP中規定好的一種數據表示格式,它與具體的CPU類型、操作系統等無關,從而可以保證數據在不同主機之間傳輸時能夠被正確解釋,網路位元組順序採用big-endian排序方式。

概述


在Windows和Linux網路編程時需要用到的,用來將主機位元組順序轉化為網路位元組順序,以Windows下的代碼為例:
htons的功能:將一個無符號短整型的主機數值轉換為網路位元組順序,即大尾順序(big-endian)
參數u_short hostshort:16位無符號整數
返回值:TCP/IP網路位元組順序.
不同的CPU有不同的位元組順序類型,這些位元組順序類型指的是整數在內存中保存的順序,即主機位元組順序。常見的有兩種:
序號英文名中文名描述
1big-endian大尾順序地址的低位存儲值的高位
2little-endian小尾順序地址的低位存儲值的低位

示例


例1

而我們常用的 x86 CPU (intel, AMD) 電腦是 little-endian,也就是整數的低位位元組放在內存的低位元組處。舉個例子吧。假定你的數據是0x1234,
在網路位元組順序里 這個數據放到內存中就應該顯示成
addr addr+1
0x12 0x34
而在x86電腦上,數據0x1234放到內存中實際是:
addr addr+1
0x34 0x12
htons 的用處就是把實際主機內存中的整數存放方式調整成網路位元組順序。

例2

我們在Intel機器下,執行以下程序
運行的結果如下圖
htons
htons
解釋一下,數字16的16進位表示為0x0010,數字4096的16進位表示為0x1000。由於Intel機器是小尾端,存儲數字16時實際順序為1000,存儲4096時實際順序為0010。因此在發送網路包時為了報文中數據為0010,需要經過htons進行位元組轉換。如果用IBM等大尾機器,則沒有這種位元組順序轉換,但為了程序的可移植性,也最好用這個函數

Tips


不同CPU上運行不同的操作系統,其主機位元組順序也是不同,參見下表:
處理器操作系統位元組順序
Alpha全部little-endian
HP-PANTlittle-endian
HP-PAUNIXbig-endian
Intelx86全部little-endian
MIPSNTlittle-endian
MIPSUNIXbig-endian
PowerPCNTlittle-endian
PowerPC非NTbig-endian