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...
程式設計,還是程式設計
喜歡程式設計,雖然水平一般,但還是執著地學習與程式設計有關的知識。中間因為工作關係與程式設計遠離了一段時間,現在又重拾起來,細想起來還是因為喜歡吧。喜歡程式軟體的思想和原理,喜歡程式 的魅力和成就感。程式設計軟體的思想是最值得學習的,一直認為思想決定行動,思想改變世界。每種軟體的流行和受人追捧,無不...
少兒程式設計程式設計
機械人比賽,聽上去讓人有一種高大上的科技感,沒錯,在大多數人眼裡,玩機械人那是科學家做的事情,不過隨著機械人教育的普及,越來越多的孩子也能夠駕馭這高大上的機械人。格物斯坦小坦克告訴你原因,這是歸結於孩子對於程式設計課程的學習,學會對機械人進行程式設計了,自然就能玩轉機械人啦。參加機械人比賽的意義遠遠...