網絡字節序_大小端 Linux_C/C++

網絡字節序——大小端

計算機內部因爲系統差異,數據存儲分爲大端存儲和小端存儲。

大端存儲:數據的位存儲在地址處,數據的位存儲在地址處(大高低)。

小端存儲:數據的位存儲在地址處,數據的位存儲在地址處(小低低)。

網絡通信要連接兩臺不同的主機,如果兩臺主機的大小端不一致,那麼通信的數據交換會無法識別。

場景1:主機A、B進行通信。主機A是大端存儲,主機B是小端存儲。

已知:發送主機發送緩衝區數據時從地址到地址發送的,

​ 接收主機接收時也是用地址到地址保存的。
在這裏插入圖片描述
假設A要發送的數據是ABCDEFGH,那麼B接收到的數據將是GHEFCDAB。

這樣無法正常通信。

所以TCP/IP規定,網絡數據流應採用大端字節序:即低地址高字節,不管自己的主機是大端存儲還是小端存儲,都應按照這個TCP/IP規定的網絡字節序來發送/接收數據。

爲了使網絡程序具有移植性,所以有C語言的庫函數做網絡字節序和主機字節序的轉換

NAME
       htonl,  htons,  ntohl,  ntohs - convert values between host and network
       byte order

SYNOPSIS	/*摘要*/
       #include <arpa/inet.h>

       uint32_t htonl(uint32_t hostlong);
       uint16_t htons(uint16_t hostshort);
       uint32_t ntohl(uint32_t netlong);
       uint16_t ntohs(uint16_t netshort);

//h表示host,n表示network,l表示32位整數,s表示16位短整數
//to表示從...變化到...
  • 如果主機是小端存儲,這些函數會將參數做相應變化再返回。
  • 如果主機是大端存儲,則不做轉換,數據原封不動返回。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章