Winsock select程式設計模型

2021-07-04 02:43:46 字數 2559 閱讀 2552

1、winsock的兩種i/o模式

windows  socket套接字可以在兩種模式下進行i/o操作:阻塞模式和非阻塞模式。

在阻塞模式下,執行i/o操作的函式在操作完成之前會一直等待,不會將這種控制權返回給程式,這樣任一線程在某一時刻只能執行乙個i/o操作。套接字在建立時預設為阻塞模式。在非阻塞模式下,執行i/o操作的winsock函式會立即返回並交出控制權,之後再通過其他機制獲得操作完成的通知。

2、windows  sockets下的程式設計模型

(1)select模式:在阻塞模式下,使用select()函式來確定乙個或多個套接字的狀態,如判斷套接字上是否有資料可讀,或者能否向乙個套接字寫入資料,防止應用程式    在套接字處於鎖定模式時,呼叫recv(或send)從沒有資料的套接字上接收資料,被迫進入阻塞狀態。其函式原型為:

intselect(

inintnfds,                         //0,無意義

in outfd_set*readfds,     //檢查可讀性

in outfd_set*writefds,     //檢查可寫性

in out fd_set*exceptfds,  //帶外資料

in conststruct timeval*timeout);    //函式的返回時間,指標null一直等待

請求狀態查詢的套接字集合由乙個fd_set結構給出,在函式返回時此結構更新以反映那些滿足特定條件的套接字的子集,同時select函式返回滿足條件的套接字的數目。標頭檔案winsock2.h中定義了一組操作fd_set結構的巨集,他們分別是:

fd_clr(s,*set)                                   從集合中刪除描述符s

fd_isset(s,*set)                             如果s是集合中的乙個元素,則返回非零,否則返回0;

fd_set(s,*set)                                       將描述符s加入集合

fd_zero(*set)                                   將集合初始化為空集

fd_setsize                                           常量,表示最多可容納套接字的數量,預設為64

select模式工作流程:

用fd_zero巨集來初始化fd_set

可以初始化的有select函式的第二三四個引數。

用fd_set巨集來將套接字控制代碼分配給相應的fd_set

例如如果想要檢查乙個套接字有資料需要接收,可以用fd_set巨集把套接接字控制代碼加入可讀性檢查佇列中

呼叫select函式。

如果該套接字沒有資料需要接收,select函式會把該套接字從可讀性檢查佇列中刪除掉,

用fd_isset對套接字控制代碼進行檢查。

如果我們所關注的那個套接字控制代碼仍然在開始分配的那個fd_set裡,那麼說明馬上可以進行相應的io操 作。

對滿足條件的套接字執行一定的操作。

貼一段別人的**例項:

#include

#include

#define port  8000     

#define msgsize  1024     

#pragma comment(lib, "ws2_32.lib")     

int totalconn = 0;      

socket socketarr[fd_setsize];      

dword winapi workerthread(lpvoid lpparam);     

int callback conditionfunc(lpwsabuf lpcallerid,lpwsabuf lpcallerdata, lpqos lpsqos,lpqos lpgqos,lpwsabuf lpcalleeid, lpwsabuf lpcalleedata,group far * g,dword dwcallbackdata);  

int main(int argc, char* argv)     

return 0;     

}     

dword winapi workerthread(lpvoid lpparam)     

;     

char szmessage[msgsize];     

while (true)      

// we only care read event     

ret = select(0, &fdread, null, null, &tv);   //3查詢滿足要求的套接字,不滿足要求,出隊  

if (ret == 0)      

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

{     

if (fd_isset(socketarr[i], &fdread))    //4.是否依然在佇列  

winsock select服務端模型

include stdafx.h include include pragma comment lib,ws2 32.lib void initsocket confirm that the winsock dll supports 2.2.note that if the dll supports...

程式設計,還是程式設計

喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...

少兒程式設計程式設計

機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...