1.
網路傳資料的時候是乙個位元組乙個位元組的傳.
字串裡的每乙個字元只用乙個位元組
,前面的就先傳
, 接收的後再解釋的時候也是按順序來
, 所以字串沒有網路位元組序的分別.
2.網路位元組序預設是大端,也就是說任何機器如果收到乙個
int型的
4個位元組,那麼這個機器就會認為第乙個位元組是最高位,最後乙個位元組是最低位。
我們看看下面這個例項:
比如我們要傳個
int資料,假設資料為
/*假設網路連線已經建立好,網路描述符為
fd*/
伺服器:
...int send = 1;
write(fd, &send, sizeof(send));
我們看一下資料的傳遞過程,假設這一端主機是小端位元組序,那麼這個過程應該是:
01 00
00 00
注:從左到右位址增大,這個是在使用者空間的擺放形式
write後,資料被拷貝到核心驅動空間,形式還是一樣的。
01 00
00 00
注:從左到右位址增大
然後就是網絡卡驅動把這個位元組發出去了,形式還是一樣。但是它是這樣來表現的,01
位元組先發,最後是
00那個位元組,這樣我們的伺服器端的資料就分析完畢了。
客戶端:(大端主機位元組序)
...int get = 0;
read(fd, &get, sizeof(get));
一開始:
00 00
00 00
注:從左到右位址增大,這個是在使用者空間的擺放形式
read的過程:
網絡卡驅動收到資料
01 00
00 00
,他知道是網路傳過來的資料都是大端資料,所以他就解釋為接受到了資料:0x01000000
因為主機序也是大端,所以不轉換,直接把核心空間的資料拷貝到使用者空間,就為:get=0x01000000.
結論:資料傳輸失敗。
那麼錯誤原因在**呢?理由就是傳送資料端應該先轉換為網路位元組序;如果伺服器端這樣寫:
伺服器:
...int send = htonl(1);
write(fd, &send, sizeof(send));
我們看一下資料的傳遞過程,假設這一端主機是小端位元組序,那麼這個過程send
的內容應該是:
00 00
00 01
注:從左到右位址增大,這個是在使用者空間的擺放形式
write後,資料被拷貝到核心驅動空間,形式還是一樣的。
注:從左到右位址增大
然後就是網絡卡驅動把這個位元組發出去了,形式還是一樣。但是它是這樣來表現的,00
位元組先發,最後是
01那個位元組,這樣我們的伺服器端的資料就分析完畢了。
那麼在客戶端收到的資料分析就為:
客戶端:(大端主機位元組序)
...int get = 0;
read(fd, &get, sizeof(get));
一開始:
00 00
00 01
注:從左到右位址增大,這個是在使用者空間的擺放形式
read的過程:
網絡卡驅動收到資料
00 00
00 00
,他知道是網路傳過來的資料都是大端資料,所以他就解釋為接受到了資料:0x00000001
(其實在這裡就決定了你的資料接受的是否正確,這裡成功解釋了,後面系統才可以正確的進行位元組序轉換)
因為主機序也是大端,所以不轉換,直接把核心空間的資料拷貝到使用者空間,就為:get=0x00000001.
結論:資料成功接受。所以傳輸資料的時候最好進行一下主機和網路位元組序的轉換。
網路位元組序和主機位元組序
不同的 cpu有不同的位元組序型別 這些位元組序是指整數在記憶體中儲存的順序 這個叫做主機序 最常見的有兩種1 little endian2 big endian le little endian 最符合人的思維的位元組序 位址低位儲存值的低位 位址高位儲存值的高位 怎麼講是最符合人的思維的位元組序...
主機位元組序和網路位元組序
1.主機位元組序和網路位元組序1 以下是從ip.h和tcp.h取的,但bsd和linux用的名稱有些不一樣主要是tcp不一樣 struct ip struct tcphdr 我所理解的big序和little序的區別 1 存整數的時候 uint32 t a 1574 1574 0x626 big序 0...
網路位元組序和主機位元組序
網路程式設計中經常用到的網路位元組序和主機位元組序的轉換,比如ip 字串 暫時只討論ipv4 是以三個點號和四個數字組成,並以點號相分隔的字串。比如說,ip是225.224.223.222,那麼整數是不是就是 0xfffefdfc呢?答案是不一定。雖然此ip位址在記憶體中的儲存順序從左至右依次是,f...