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的全部內...