主機序和網路序以及使用例子

2022-07-22 21:57:20 字數 1693 閱讀 1952

為什麼存在這兩個東西:

空中傳輸的位元組的順序即網路位元組序為標準順序,考慮到與協議的一致以及與同類其它平台產品的互通,在程式中發資料報時,將主機位元組序轉換為網路位元組序,收資料報處將網路字 節序轉換為主機位元組序

網路程式開發時 或是跨平台開發時 應該注意保證只用一種位元組序 不然兩方的解釋不一樣就會產生bug

主機序:

不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序

1. little endian:將低序位元組儲存在起始位址 

2. big endian:將高序位元組儲存在起始位址 

le little-endian 

最符合人的思維的位元組序 

位址低位儲存值的低位 

位址高位儲存值的高位 

怎麼講是最符合人的思維的位元組序,是因為從人的第一觀感來說 

低位值小,就應該放在記憶體位址小的地方,也即記憶體位址低位 

反之,高位值就應該放在記憶體位址大的地方,也即記憶體位址高位 

be big-endian 

最直觀的位元組序 

位址低位儲存值的高位 

位址高位儲存值的低位 

為什麼說直觀,不要考慮對應關係 

只需要把記憶體位址從左到右按照由低到高的順序寫出 

把值按照通常的高位到低位的順序寫出 

兩者對照,乙個位元組乙個位元組的填充進去

網路序:

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

常用的轉換函式:

htons ntohs htonl ntohl (s 就是short l是long h是host n是network)

例子

。。。。。。

struct

sockaddr_in client,server;

char

buf[max_len];

char

flag[max_len];

file *fq_send=null,*fq_rec=null;

int len,opt = 1;

if( ( sd = socket(af_inet,sock_stream,0)) == -1

)

bzero(&server,sizeof

(server));

server.sin_family =af_inet;

server.sin_port = htons(ser_port);//

將埠號的主機序轉為網路序

server.sin_addr.s_addr = inet_addr("

127.0.0.1");

setsockopt(sd,sol_socket,so_reuseaddr,&opt,sizeof

(opt));

if( connect(sd,(struct sockaddr *)&server,sizeof(server)) < 0

)

。。。。。。

主機序和網路序

不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 1 little endian 將低序位元組儲存在起始位址 2 big endian 將高序位元組儲存在起始位址 le little endian 最符合人的思維的位元組序 位址低位儲存值的低...

主機序和網路序

不同的cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種 1 little endian 將低序位元組儲存在起始位址 2 big endian 將高序位元組儲存在起始位址 le little endian 最符合人的思維的位元組序 位址低位儲存值的低...

主機位元組序和網路位元組序(大端序,小端序,網路序)

根據cpu的不同我們可以把主機位元組序在記憶體中儲存的順序叫做主機序,也就是我們常說的,大端機和小端機。我們經常看到的有兩種 1.小端機 記憶體中以小端序儲存的機器 將低位元組序儲存在開始的位址 及記憶體較小的記憶體 舉個例子 我們將記憶體從左到右排列 在記憶體中存放0x01020304 2000 ...