SOCKET 網絡字節序與主機字節序及其相互轉換

主機字節序:整數在內存中保存的順序

 

兩種方式:

Little endian 將低序字節存儲在起始地址

Big endian    將高序字節存儲在起始地址

 

網絡字節序:整數在網絡中的發送順序

標準規定

Big endian   首先發送高位字節

字節序轉換函數

htonl: 轉換long類型到網絡字節序

htons: 轉換short類型到網絡字節序

ntohl: 轉換網絡字節序到long類型

ntohs: 轉換網絡字節序到short類型

inet_addr: 將字符串格式IP轉換到網絡字節序

inet_ntoa: 將網絡字節序格式IP轉換到字符串

舉例:SOCKADDR_IN中的數據格式

SOCKADDR_IN addr;
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
addr.sin_port = htons(5120);
addr.sin_family = AF_INET;

該結構體中的成員sin_addr, sin_port使用的是網絡字節序

sin_addr:

inet_addr()返回的已經是網絡字節序

127.0.0.1 --> 0x7F.00.00.01

-> 01 低位

    00

    00

    7F 高位

sin_port:

5120(0x1400)在內存中的佈局是

    00 低位

    14 高位

經過htons處理後

    14 低位

    00 高位

個人理解:重要的是標準

其實這個轉換要解決的問題是網絡上各個主機中數據類型的兼容問題。

假設有兩個主機A和B,A主機採用了LE字節序,B主機採用了BE字節序,

那麼整數0x12345678在A主機中的表示是

    低位--------->高位

0x 78    56    34    12

如果不進行字節序變換A將這個數發給B主機時,B主機收到後在的數保存了內存佈局,

將這個數解釋爲 0x78563412 就會出現錯誤


來源:http://blog.csdn.net/icedmilk/article/details/5336296

發佈了44 篇原創文章 · 獲贊 0 · 訪問量 13萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章