linux網路程式設計基礎(一)

2021-06-01 03:28:32 字數 2028 閱讀 7483

一、資料儲存順序:大端和小端

高位位元組儲存高位元組稱為小端模式,通常都計算機採用這個模式儲存。而網路則採用大端傳輸。所以需要轉換

面試有時會出這麼個題:寫乙個程式判斷程式的儲存是大端還是小端?

程式的原理見下圖:

#include#includeunion wordc;

int check()

int main()else

}

利用union的特點,判斷出了大端還是小端。

還有一道經典的面試題是 :

#includeint main();

int *ptr1 = (int *)(&a+1);

int *ptr2 = (int *)((int)a+1);

printf("%x , %x\n",ptr1[-1],*ptr2);

}

結果是:2 , 2000000 。

第乙個值的計算請參考

面試知識總結(一)

中的第四題。

第二個值的計算如下圖:

將a轉換為整形,然後增加1,再轉回指標型,相當於只移動了乙個bit。由於是小端儲存,會將下乙個數的末尾讀進來。

二、位元組序的處理。

因為存在大端小端的問題,所以就要進行統一的轉換。

注意字串是不用轉換的,因為乙個字元正好佔一位元組。儲存順序不影響值。而浮點數也不用轉換,因為浮點數的讀取規則是在cpu中定義的,是一致的。

轉換所用的函式為:

htons(),htonl();        主機轉為網路位元組序,s為short , l為long

ntohs(),ntohl();         網路轉為主機位元組序。

三、位址格式的轉換

通常情況下,都是用點分十進位制(如:202.134.23.145)來表示ip位址。是個字串。但是程式中處理時用到的是乙個二進位制的值。所以要進行轉換。

對於ipv4有以下4個函式:

#include#include#includeint main()
編譯執行的結果:

[fsy@localhost 400]$ ./addr

inet_addr:0xb2d26ca

inet_network:0xca262d0b

inet_ntoa:202.30.45.11

inet_aton:0xb2d26ca

[fsy@localhost 400]$

而對於結構不同的ipv6就不行了。但有兩個函式可以通用於ipv4和ipv6:

#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模式 優點缺點 資料快取本地,效率高 工作量大,開發周期更...