高階程式設計之網路程式設計(三)

2021-07-09 14:02:27 字數 1810 閱讀 7476

io 模型

1、阻塞模型

fifo  pipe   read  fgetc fgets  fread recv recvfrom

以上獲取資料的函式預設都是阻塞方式接收資料。

2、非阻塞模型

2.1 在開始階段的open函式部分調整 。

open("./fifo",o_rdonly|o_nonblock);

函式  open  read ....都不會阻塞。

2.2 在檔案開啟之後操作過程中調整。

fcntl()===>用法

int flag  ;

flag = fcntl(fd,f_getfl,0);///獲取當前fd檔案的屬性。

flag = flag | o_nonblock;  ///修改當前屬性為非阻塞方式。

fcntl(fd,f_setfl,flag);    ///設定當前fd檔案的屬性為flag

3、多路復用模型

3.1  簡單迴圈伺服器

由伺服器端為每個新鏈結建立一次鏈結過程並獲取資料

之後關閉鏈結,等待下乙個新鏈結。

while(1)

適用範圍:資料通訊過程短,傳送資料少,實時時間短。

缺陷:每次客戶端傳送完畢下次傳送需要重鏈。

3.2  fork迴圈伺服器

伺服器為客戶端的鏈結每次新建乙個子程序用來保持通訊

父程序繼續迴圈檢測,如果還有新鏈結則繼續fork子程序。

while(1)

}else

if(count >40) break;}

for(i=0;i<40;i++)

缺陷:1 、有殭屍程序出現

2、客戶端退出伺服器無法獲取。

3、資源消耗大

4、子程序退出不方便**

適用範圍: 客戶端個數少

客戶端能正常退出並有一定時間範圍。

3、select迴圈伺服器 ====>通過select 函式完成io的多路復用。

標頭檔案: sys/select.h  sys/time.h  sys/types.h unistd.h

函式:int select(int nfds, fd_set *readfds, fd_set *writefds,

fd_set *exceptfds, struct timeval *timeout);

功能:通過該函式可以動態檢測當前指定的檔案描述符集合中有

資料變化的檔案描述符,並將其他描述符刪除,只保留當

前有資料流的描述符。同時該函式具有阻塞等待功能。

引數:nfds   當前程序開啟的最大描述符的邊界值。

readfds  讀操作的描述符集合

writefds 寫操作的描述符集合

exectpfds 異常描述符集合。如果為null表示不對異常描述符處理。

timeout  超時設定,如果該值為null表示一直阻塞檢測。

返回值:成功 0

失敗 -1;

void fd_clr(int fd, fd_set *set);

功能:將描述符集合set中的fd描述符刪除。

int  fd_isset(int fd, fd_set *set);

功能:判斷fd描述符是否在set集合中。如果是則返回真,否則假。

void fd_set(int fd, fd_set *set);

功能:將fd描述符新增到set集合中。

void fd_zero(fd_set *set);

功能:將set集合中所有描述符刪除。

練習:用select 函式完成乙個併發檔案伺服器,可以接收客戶端

傳送的檔案並以客戶端ip形式儲存到本地伺服器。

高階程式設計之 socker程式設計

用來標記網路上的一台電腦 window ifconfiglinux ipconfig1 1 3 1.ipv4 被廣泛使用的 ip協議的版本號是4 當前再用,目前被廣泛應用 ipv4的位址位數為32位 4位位元組 位址有限,幾乎全部耗盡 1 1 3 2.ipv6 ip協議的版本號是6 ipv6的位址位...

網路程式設計之Socket程式設計

對 tcp ip udp socket 程式設計這些詞你不會很陌生吧?隨著網路技術的發展,這些詞充斥著我們的耳朵。那麼我想問 1.什麼是tcp ip udp?2.socket在 呢?3.socket是什麼呢?4.你會使用它們嗎?什麼是tcp ip udp?tcp ip transmission co...

網路程式設計之socket程式設計

大多數專案是在linux下開發伺服器端,而在windows下開發客戶端,需要經常在兩大平台之間進行切換,單獨學習一種平台沒有實踐意義。值得欣慰的是,兩大平台下的 socket 程式設計非常相似,並不會增加多少學習成本。網路程式設計就是編寫程式使兩台聯網的計算機相互交換資料。這就是socket的全部內...