C 網路程式設計之select

2021-09-28 23:26:00 字數 1386 閱讀 2828

原型:

#include int select(int maxfd, fd_set *rdset, fd_set *wrset, fd_set *exset, struct timeval *timeout);
功能:

select用來實現多路復用輸入/輸出模型。select系統呼叫來讓我們的程式監視多個檔案控制代碼的狀態變化。程式會停在select處等待,知道被監視的檔案控制代碼有乙個或多個發生了改變,可以等待執行非同步i/o。

引數:

#include struct timeval  

;

若設定timeout為以下值:

返回值:

執行成功則返回檔案描述詞狀態已改變的個數,如果返回0代表在描述詞狀態改變前已超過timeout時間,沒有返回;當有錯誤發生時則返回-1,錯誤原因存於errno,此時引數readfds,writefds,exceptfds和timeout的值變成不可**。如果返回值為socket_error,可以通過wsagetlasterror函式檢索指定的錯誤碼。

錯誤碼解釋

wsanotinitialisted

在使用此函式之前,wsastartup函式必須成功的執行

wsae****t

套接字執行時不能分配需要的資源或者readfds、writefds、exceptfds、timeval引數不是使用者位址空間的一部分。

wsaenetdown

網路子系統失敗

wsaeinval

超時值不合法的,或者其他的三個引數為空。

wsaeintr

阻塞的套接字1.1呼叫通過wsacancelblockingcall取消

wsaeinprogress

阻塞的套接字1.1呼叫正在處理或者服務提供者正在處理乙個掉使用者函式。

wsaenotsock

描述集中包括乙個不是套接字的入口。

(1)常見的程式片段如下:

fs_set readset;

fd_zero(&readset);

fd_set(fd,&readset);

select(fd+1,&readset,null,null,null);

if(fd_isset(fd,readset)

(2)理解select模型

理解select模型的關鍵在於理解fd_set,為說明方便,取fd_set長度為1位元組,fd_set中的每一bit可以對應乙個檔案描述符fd。則1位元組長的fd_set最大可以對應8個fd。

基於上面的討論,可以輕鬆得出select模型的特點:

注:

Linux網路程式設計之select

使用select多路復用技術的非阻塞模型 select多路復用通常具有很好的跨平台性,也能提供不錯的併發效能,但是在通常情況下有最大監聽檔案描述符的限制 通常1024 如果不需要達到c10k這種前端高效能伺服器的要求,採用select nonblocking的方式能降低程式設計的難度 用到的介面 f...

Linux C網路程式設計之select函式

開門見山,如果我們要對多個客戶端連線的多個事件進行操作,首先會想到建立多個執行緒或程序讓其去各自進行,這也是最簡單的模式。但對每乙個執行緒或程序而言,無論連線是否有事件發生,都必須隨時待命,也就是說,每乙個物件都必須有乙個執行緒或程序與之一一對應,直到物件銷毀。可想而知,當連線量規模變大後,系統需要...

windows網路程式設計之Select模型基礎知識

網路程式設計之select模型 一.設計思想 利用select函式,判斷套接字上是否存在資料,或者能否向乙個套接字寫入資料。目的是防止應用程式在套接字處於鎖定模式時,呼叫recv 或send 從沒有資料的套接字上接收資料,被迫進入阻塞狀態。二.select函式 2.1 select函式 int se...