一、資料儲存順序:大端和小端
高位位元組儲存高位元組稱為小端模式,通常都計算機採用這個模式儲存。而網路則採用大端傳輸。所以需要轉換
面試有時會出這麼個題:寫乙個程式判斷程式的儲存是大端還是小端?
程式的原理見下圖:
利用union的特點,判斷出了大端還是小端。#include#includeunion wordc;
int check()
int main()else
}
還有一道經典的面試題是 :
結果是:2 , 2000000 。#includeint main();
int *ptr1 = (int *)(&a+1);
int *ptr2 = (int *)((int)a+1);
printf("%x , %x\n",ptr1[-1],*ptr2);
}
第乙個值的計算請參考
面試知識總結(一)
中的第四題。
第二個值的計算如下圖:
將a轉換為整形,然後增加1,再轉回指標型,相當於只移動了乙個bit。由於是小端儲存,會將下乙個數的末尾讀進來。
二、位元組序的處理。
因為存在大端小端的問題,所以就要進行統一的轉換。
注意字串是不用轉換的,因為乙個字元正好佔一位元組。儲存順序不影響值。而浮點數也不用轉換,因為浮點數的讀取規則是在cpu中定義的,是一致的。
轉換所用的函式為:
htons(),htonl(); 主機轉為網路位元組序,s為short , l為long
ntohs(),ntohl(); 網路轉為主機位元組序。
三、位址格式的轉換
通常情況下,都是用點分十進位制(如:202.134.23.145)來表示ip位址。是個字串。但是程式中處理時用到的是乙個二進位制的值。所以要進行轉換。
對於ipv4有以下4個函式:
#include#include#includeint main()
編譯執行的結果:
而對於結構不同的ipv6就不行了。但有兩個函式可以通用於ipv4和ipv6:[fsy@localhost 400]$ ./addr
inet_addr:0xb2d26ca
inet_network:0xca262d0b
inet_ntoa:202.30.45.11
inet_aton:0xb2d26ca
[fsy@localhost 400]$
#include#include#include#includeint main()
四、網域名稱與ip資訊的解析
ip位址不好記,所以便有了網域名稱。
可以通過返回主機資訊:
編譯輸出為:#include#include#include#includeint main(int argc,char **argv)
//輸出主機名
printf("h_name: %s\n",hptr->h_name);
//主機備選名稱,以null結尾的列表
for(pptr=hptr->h_aliases;*pptr!=null;pptr++)
//主機網路位址,以null結尾的列表
for(pptr=hptr->h_addr_list;*pptr!=null;pptr++)}}
本篇部落格出自
阿修羅道
Linux網路程式設計(一)基礎
一 資料儲存順序 大端和小端 大端模式 位址的增長順序與值的增長順序相反 小段模式 位址的增長順序與值的增長順序相同 為什麼會有大小端模式之分呢?這是因為在計算機系統中,我們是以位元組為單位的,每個位址單元都對應著乙個位元組,乙個位元組為8bit。但是在c語言中除了8bit的char之外,還有16b...
Linux網路程式設計基礎 一
1 怎樣完成網路程式設計 伺服器 提供資料的為伺服器 客戶端 獲取資料的為客戶端 2 協議的選擇 tcp 面向連線,可靠的流式服務 udp 無連線的,不可靠的,資料報服務 3 tcp的程式設計流程 sever 伺服器端 建立socket include include int socket int ...
linux網路程式設計基礎 網路基礎
客戶機 client 伺服器 server 模式。需要在通訊兩端各自部署客戶機和伺服器來完成資料通訊。瀏覽器 browser 伺服器 server 模式。只需在一端部署伺服器,而另外一端使用每台pc都預設配置的瀏覽器即可完成資料的傳輸。c s模式 優點缺點 資料快取本地,效率高 工作量大,開發周期更...