青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

yehao's Blog

套接字IO模型(三) WSAEventSelect模型

http://www.cnblogs.com/NeuqUstcIim/archive/2008/08/14/1268214.html
WSAEventSelect模型類似WSAAsynSelect模型,但最主要的區別是網絡事件發生時會被發送到一個事件對象句柄,而不是發送到一個窗口。這樣可能更加的好,對于服務器端的程序來說。

使用步驟如下:

a、 創建事件對象來接收網絡事件:

WSAEVENT WSACreateEvent( void );

該函數的返回值為一個事件對象句柄,它具有兩種工作狀態:已傳信(signaled)和未傳信(nonsignaled)以及兩種工作模式:人工重設(manual reset)和自動重設(auto reset)。默認未未傳信的工作狀態和人工重設模式。

 

b、將事件對象與套接字關聯,同時注冊事件,使事件對象的工作狀態從未傳信轉變未已傳信。

int WSAEventSelect( SOCKET s,WSAEVENT hEventObject,long lNetworkEvents );
s為套接字
hEventObject為剛才創建的事件對象句柄

lNetworkEvents為掩碼,定義如上面所述

 

c、I/O處理后,設置事件對象為未傳信
BOOL WSAResetEvent( WSAEVENT hEvent );
Hevent為事件對象

成功返回TRUE,失敗返回FALSE。

 

d、等待網絡事件來觸發事件句柄的工作狀態:

DWORD WSAWaitForMultipleEvents( DWORD cEvents,const WSAEVENT FAR * lphEvents, BOOL fWaitAll,DWORD dwTimeout, BOOL fAlertable );
lpEvent為事件句柄數組的指針
cEvent為為事件句柄的數目,其最大值為WSA_MAXIMUM_WAIT_EVENTS
fWaitAll指定等待類型:TRUE:當lphEvent數組重所有事件對象同時有信號時返回;
FALSE:任一事件有信號就返回。
dwTimeout為等待超時(毫秒)

fAlertable為指定函數返回時是否執行完成例程

 

nIndex=WSAWaitForMultipleEvents(…);

MyEvent=EventArray[Index- WSA_WAIT_EVENT_0];

 

 

事 件選擇模型也比較簡單,實現起來也不是太復雜,它的基本思想是將每個套接字都和一個WSAEVENT對象對應起來,并且在關聯的時候指定需要關注的哪些網 絡事件。一旦在某個套接字上發生了我們關注的事件(FD_READ和FD_CLOSE),與之相關聯的WSAEVENT對象被Signaled。程序定義 了兩個全局數組,一個套接字數組,一個WSAEVENT對象數組,其大小都是MAXIMUM_WAIT_OBJECTS(64),兩個數組中的元素一一對 應。
同樣的,這里的程序沒有考慮兩個問題,一是不能無條件的調用accept,因為我們支持的并發連接數有限。解決方法是將套接字按 MAXIMUM_WAIT_OBJECTS分組,每MAXIMUM_WAIT_OBJECTS個套接字一組,每一組分配一個工作者線程;或者采用 WSAAccept代替accept,并回調自己定義的Condition Function。第二個問題是沒有對連接數為0的情形做特殊處理,程序在連接數為0的時候CPU占用率為100%。

 

 1 SOCKET       Socket[WSA_MAXIMUM_WAIT_EVENTS];
 2 WSAEVENT   Event[WSA_MAXINUM_WAIT_EVENTS];
 3 SOCKET    Accept, Listen;
 5 DWORD     EventTotal = 0;
 6 DWORD     Index;
 7 
 8 //Set up a TCP socket for listening on port 5150
 9 Listen = socket(PF_INET,SOCK_STREAM,0);
10 
11 InternetAddr.sin_family      = AF_INET;
12 InternetAddr.sin_addr.s_addr = htonl(INADDR_ANY);
13 InternetAddr.sin_port        = htons(5150);
14 
15 bind(Listen,(PSOCKADDR) &InternetAddr,sizeof(InternetAddr));
16 
17 NewEvent = WSACreateEvent();
18 
19 WSAEventSelect(Listen,NewEvnet,FD_ACCEPT|FD_CLOSE);
20 
21 listen(Listen,5);
22 
23 Socket[EventTotal] = Listen;
24 Event[EventTotal] = NewEvent;
25 EventTotal++;
26 
27 while (TRUE)
28 {
29     //Wait for network events on all sockets
30     Index = WSAWaitForMultipleEvents(EventTotal,EventArray,FALSE,WSA_INFINITE,FALSE);
31 
32     WSAEnumNewWorkEvents(SocketArray[Index-WSA_WAIT_EVENT_0],
33         EventArray[Index-WSA_WAIT_EVENT_0],
34         &NetworkEvents);
35     //Check for FD_ACCEPT messages
36     if (NetworkEvents.lNetworkEvents & FD_ACCEPT)
37     {
38         if (NetworkEvents.iErrorCode[FD_ACCEPT_BIT] !=0)
39         {
40             //Error
41             break;
42         }
43         //Accept a new connection and add it to the socket and event lists
44         Accept = accept(SocketArray[Index-WSA_WAIT_EVENT_0],NULL,NULL);
45 
46         //We cannot process more than WSA_MAXIMUM_WAIT_EVENTS sockets ,
47         //so close the accepted socket
48         if (EventTotal > WSA_MAXIMUM_WAIT_EVENTS)
49         {
50             printf("..");
51             closesocket (Accept);
52             break;
53         }
54         NewEvent = WSACreateEvent();
55 
56         WSAEventSelect(Accept,NewEvent,FD_READ|FD_WRITE|FD_CLOSE);
57 
58         Event[EventTotal] = NewEvent;
59         Socket[EventTotal]= Accept;
60         EventTotal++;
61         prinrt("Socket %d connect\n",Accept);
62     }
63     //Process FD_READ notification
64     if (NetworkEvents.lNetwoAD)rkEvents & FD_RE
65     {
66         if (NetworkEvents.iErrorCode[FD_READ_BIT !=0])
67         {
68             //Error
69             break;
70         }
71 
72         //Read data from the socket
73         recv(Socket[Index-WSA_WAIT_EVENT_0],buffer,sizeof(buffer),0);
74     }
75     //process FD_WRITE notitication
76     if (NetworkEvents.lNetworkEvents & FD_WRITE)
77     {
78         if (NetworkEvents.iErrorCode[FD_WRITE_BIT] !=0)
79         {
80             //Error
81             break;
82         }
83         send(Socket[Index-WSA_WAIT_EVENT_0],buffer,sizeof(buffer),0);
84     }
85     if (NetworkEvents.lNetworkEvents & FD_CLOSE)
86     {
87         if(NetworkEvents.iErrorCode[FD_CLOSE_BIT] !=0)
88         {
89             //Error
90             break;
91         }
92         closesocket (Socket[Index-WSA_WAIT_EVENT_0]);
93         //Remove socket and associated event from the Socket and Event arrays and
94         //decrement eventTotal
95         CompressArrays(Event,Socket,& EventTotal);
96     }
97 }

posted on 2011-08-18 16:08 厚積薄發 閱讀(602) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

導航

<2025年11月>
2627282930311
2345678
9101112131415
16171819202122
23242526272829
30123456

統計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            国产一区在线免费观看| 老色鬼久久亚洲一区二区| 国产欧美日韩精品专区| 国产噜噜噜噜噜久久久久久久久| 欧美视频一区二区三区在线观看| 欧美人妖在线观看| 欧美午夜大胆人体| 国产日韩精品在线播放| 国产亚洲制服色| 久久久久久**毛片大全| 免费欧美电影| 国产欧美一区二区三区久久| 国产精品一区二区三区观看| 国产亚洲第一区| 精品成人乱色一区二区| 亚洲三级电影全部在线观看高清| 夜夜嗨av一区二区三区| 亚洲精品欧洲精品| 亚洲在线免费视频| 久久久久久色| 亚洲激情六月丁香| 亚洲精选国产| 久久成人精品一区二区三区| 欧美精品入口| 一区二区三区四区精品| 影音先锋成人资源站| 亚洲精品一区二区在线| 亚洲视频碰碰| 久久久www免费人成黑人精品| 另类av导航| 国产精品区免费视频| 亚洲国产导航| 午夜国产精品视频免费体验区| 美女视频一区免费观看| 宅男噜噜噜66一区二区66| 久久一区激情| 欧美电影免费观看| 国内精品久久久久久久影视蜜臀| 一本色道久久综合精品竹菊| 另类成人小视频在线| 一本一本a久久| 欧美电影免费观看网站| 极品尤物久久久av免费看| 亚洲欧美日韩中文播放| 亚洲精品久久久久久下一站| 久久影视三级福利片| 国产亚洲精品福利| 亚洲在线视频一区| 亚洲成色777777女色窝| 欧美日韩一区二区精品| 亚洲国产精品成人久久综合一区| 欧美一区在线看| 在线中文字幕日韩| 欧美日韩一区二区三区| 99精品国产在热久久下载| 欧美激情按摩| 久久久另类综合| 国产午夜精品理论片a级探花| 亚洲中午字幕| 亚洲午夜激情在线| 国产精品激情偷乱一区二区∴| 亚洲视频导航| 一区二区三区鲁丝不卡| 欧美午夜一区二区三区免费大片 | 国产精品久久久久久久久借妻| 午夜精品影院在线观看| 午夜欧美视频| 亚洲自拍都市欧美小说| 国产欧美精品久久| 久久亚洲一区二区三区四区| 久久久久久久高潮| 亚洲国产成人久久综合一区| 亚洲电影成人| 欧美国产日本韩| 亚洲色图综合久久| 亚洲性色视频| 一区在线免费| 亚洲精品美女| 国产精品九九久久久久久久| 欧美一区二区在线免费观看| 欧美影院久久久| 91久久午夜| 国产精品国产三级国产| 免费国产一区二区| 国产婷婷一区二区| 欧美成人官网二区| 欧美精品在线视频| 欧美一区二区三区播放老司机 | 国产欧美大片| 久久精品一本| 欧美成人午夜激情视频| 亚洲性感激情| 久久久999国产| 亚洲一二三区精品| 久久久久久**毛片大全| 中文欧美字幕免费| 久久精品人人做人人综合| 日韩亚洲欧美在线观看| 亚洲资源在线观看| 亚洲精品一区二区三区蜜桃久| 欧美激情第8页| 亚洲日本乱码在线观看| 一区二区三区欧美在线观看| 激情久久五月| 在线亚洲精品| 亚洲精品在线三区| 久久成人综合视频| 国产精品99久久久久久久女警 | 国产精品日本| 亚洲第一伊人| 国产一区二区三区精品欧美日韩一区二区三区 | 午夜欧美不卡精品aaaaa| 亚洲破处大片| 久久国产精彩视频| 亚洲欧美日韩另类精品一区二区三区| 久久综合一区二区| 欧美激情综合在线| 亚洲欧美日韩另类精品一区二区三区| 国产日韩精品在线观看| 亚洲大片在线观看| 国产精品美女视频网站| 亚洲国产欧美国产综合一区| 国产综合久久久久影院| 亚洲永久精品大片| 一区二区国产精品| 欧美好吊妞视频| 欧美成人午夜免费视在线看片| 国产乱码精品一区二区三区五月婷 | 久久免费国产精品| 在线中文字幕日韩| 欧美精品免费播放| 亚洲肉体裸体xxxx137| 亚洲精品资源美女情侣酒店| 美女诱惑一区| 午夜精品国产精品大乳美女| 在线观看国产成人av片| 一区二区三区国产精华| 亚洲无线视频| 欧美精品性视频| 亚洲国产视频直播| 亚洲人成在线免费观看| 欧美国产视频日韩| 亚洲精品久久久久久下一站| av成人免费| 欧美性生交xxxxx久久久| 在线视频亚洲| 久久av一区| 激情综合五月天| 蜜桃精品一区二区三区| 亚洲日本激情| 亚洲欧美一区二区在线观看| 国产精品久久久久天堂| 欧美一区观看| 欧美国产欧美综合| 91久久精品视频| 欧美午夜精品久久久久久人妖| 亚洲高清久久久| 国内久久精品视频| 欧美日韩视频第一区| 一本久道综合久久精品| 性欧美暴力猛交69hd| 国内外成人免费视频 | 亚洲高清中文字幕| 99在线精品免费视频九九视| 国产精品久久国产精品99gif| 午夜在线视频观看日韩17c| 久热精品视频| 日韩视频永久免费| 国产精品久久波多野结衣| 久久久久久精| 中文高清一区| 欧美91精品| 亚洲免费在线播放| 91久久精品久久国产性色也91| 国产精品久久久久77777| 久久久久国产一区二区| 夜夜嗨av一区二区三区四季av| 久久久成人网| 亚洲天堂偷拍| 1000部国产精品成人观看| 欧美大片一区| 午夜久久久久久| 99在线视频精品| 欧美高清在线一区二区| 欧美一区二区啪啪| 一区二区三区视频观看| 一区二区三区在线看| 国产精品伦理| 欧美精品 国产精品| 久久国产精品亚洲va麻豆| 欧美二区在线看| 亚洲欧美日韩成人高清在线一区| 亚洲黄网站在线观看| 狠狠色狠狠色综合日日小说| 欧美午夜不卡影院在线观看完整版免费| 久久看片网站| 久久激情五月丁香伊人| 久久亚洲不卡| 久久久国产亚洲精品| 欧美一区国产在线|