前言:在正式開始學習socket編程之前,有必要了解網路位元組序、主機位元組序、大小端、如何判斷大小端、在Linux當中如何轉換主機位元組序與網路位元組序,為之后通用socket地址、專用socket地址、地址轉換等知識點打下基礎,
目錄
什么是位元組序?
位元組序分類:大端位元組序、小端位元組序
網路位元組序與主機位元組序
不同位元組序之間傳輸問題
Linux主機位元組序-網路位元組序轉換API
面試題:寫一段程式判斷大小端
參考:
什么是位元組序?
CPU累加器一次能裝載至少4個位元組,即一個整數,每次裝載的位元組在記憶體中的排列順序將影響它被累加器裝載成整數的值,因此,位元組序是指多位元組資料在計算機記憶體中存盤或者網路傳輸時各位元組的存盤順序,
位元組序分類:大端位元組序、小端位元組序
- 小端位元組序(little endian):低位元組資料存放在記憶體低地址
- 大端位元組序(bigendian): 低位元組資料存放在高地址處
網路位元組序與主機位元組序
- 主機位元組序:現在計算機大多數采用小端位元組序,因此小端位元組序又被稱為主機位元組序,
- 網路位元組序:網路傳輸、檔案儲存、人類讀寫習慣使用大端位元組序,因此大端位元組序又被稱為網路位元組序,
不同位元組序之間傳輸問題
不同位元組序在兩臺主機上傳輸勢必造成解釋不同導致錯誤,不僅是不同主機之間的資料傳輸,同一主機不同行程之間通信,也需要考慮位元組序問題,如JAVA虛擬機采用大端位元組序,
通常的做法是:發送端總是把要發送的資料轉換成大端位元組序后再發送,而接收方知道對方發送過來的是采用大端位元組序,所以接收端會根據自身采用的位元組序決定是否對接收到的資料進行轉換,
Linux主機位元組序-網路位元組序轉換API
#include <netinet/in.h>
unsigned long int htonl(unsigned long int hostlong);// host to network long
unsigned short int htons(unsigned long int hostshort);// host ot network short
unsigned long int ntohl(unsigned long int netlong);// network to hostlong
unsigned short int ntohs(unsigned short int netshort);// network to hostshort
釋義:如htonl,表示host to network long,將長型整型的主機位元組序轉換成網路位元組序,
面試題:寫一段程式判斷大小端
union 型資料所占的空間等于其最大的成員所占的空間,對 union 型的成員的存取都是相對于該聯合體基地址的偏移量為 0 處開始,也就是聯合體的訪問不論對哪個變數的存取都是從 union 的首地址位置開始,
聯合是一個在同一個存盤空間里存盤不同型別資料的資料型別,這些存盤區的地址都是一樣的,聯合里不同存盤區的記憶體是重疊的,修改了任何一個其他的會受影響,
int checkCPU()
{
union w
{
int a;
char b;
}c;
c.a = 1;
return (c.b == 1); // 小端回傳TRUE,大端回傳FALSE
}
參考:
- 《Linux高性能服務器編程》
- 《Linux多執行緒服務端編程》
- 《C++并發編程實戰》
- 《計算機網路——自頂向下方法》
- 《TCP/IP詳解——卷2:實作》
- 《計算機作業系統》西安電子科技大學出版社
- 《鳥哥的Linux私房菜》
- 《Linux指令范例速查手冊》
- 《深度探索C++面向物件模型》
- 《Effective C++ 改善程式與設計的55個具體做法》
- 《編程珠璣》
- 《后臺開發核心技術與應用實踐》
- 《Essential C++》
- 《More Effective C++》
- 《編譯原理》
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/291854.html
標籤:其他
