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

yehao's Blog

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

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

使用步驟如下:

a、 創(chuàng)建事件對象來接收網絡事件:

WSAEVENT WSACreateEvent( void );

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

 

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

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

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

 

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

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

 

d、等待網絡事件來觸發(fā)事件句柄的工作狀態(tài):

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為指定函數返回時是否執(zhí)行完成例程

 

nIndex=WSAWaitForMultipleEvents(…);

MyEvent=EventArray[Index- WSA_WAIT_EVENT_0];

 

 

事 件選擇模型也比較簡單,實現起來也不是太復雜,它的基本思想是將每個套接字都和一個WSAEVENT對象對應起來,并且在關聯(lián)的時候指定需要關注的哪些網 絡事件。一旦在某個套接字上發(fā)生了我們關注的事件(FD_READ和FD_CLOSE),與之相關聯(lián)的WSAEVENT對象被Signaled。程序定義 了兩個全局數組,一個套接字數組,一個WSAEVENT對象數組,其大小都是MAXIMUM_WAIT_OBJECTS(64),兩個數組中的元素一一對 應。
同樣的,這里的程序沒有考慮兩個問題,一是不能無條件的調用accept,因為我們支持的并發(fā)連接數有限。解決方法是將套接字按 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 厚積薄發(fā) 閱讀(596) 評論(0)  編輯 收藏 引用 所屬分類: 網絡編程

導航

<2025年9月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

統(tǒng)計

常用鏈接

留言簿

隨筆分類

文章分類

文章檔案

搜索

最新評論

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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片| 日韩视频在线免费观看| 亚洲影院色无极综合| 久久国产天堂福利天堂| 欧美护士18xxxxhd| 亚洲一区二区不卡免费| 久久精品主播| 欧美日韩国产综合网| 国产精品日韩在线观看| 在线观看日韩国产| 亚洲制服av| 久久人人九九| 亚洲美女av黄| 久久国内精品视频| 欧美日韩一区在线观看| 在线观看日韩国产| 欧美一区二区视频在线观看| 亚洲国产1区| 久久国产精品72免费观看| 欧美日韩国产不卡| 在线精品视频一区二区三四| 亚洲免费一级电影| 亚洲国产精品久久久久| 午夜精品久久久久久久99水蜜桃| 久久五月激情| 国产精品一区二区三区成人| 亚洲人成网站精品片在线观看| 欧美一区二区在线免费观看| 亚洲国产成人av好男人在线观看| 午夜精品视频| 欧美午夜精品久久久久久人妖| 国内外成人免费激情在线视频| 在线视频欧美日韩精品| 欧美高清在线观看| 久久久久久久尹人综合网亚洲 | 亚洲午夜高清视频| 国产免费成人在线视频| 夜夜夜精品看看| 欧美电影免费| 久久久激情视频| 国产亚洲视频在线| 翔田千里一区二区| 亚洲一区二区成人| 国产精品国产亚洲精品看不卡15| 亚洲日本无吗高清不卡| 免费观看亚洲视频大全| 久久精品欧洲| 红桃视频欧美| 乱码第一页成人| 久久精品人人做人人综合| 国产日韩精品视频一区二区三区| 亚洲欧美在线网| 亚洲影院色在线观看免费| 国产精品久久久免费| 亚洲欧美在线播放| 午夜亚洲视频| 国产欧美日韩综合| 久久久久国产精品厨房| 久久精品国产久精国产爱| 精品成人久久| 亚洲福利视频三区| 欧美日韩高清在线| 亚洲综合日韩在线| 午夜在线视频观看日韩17c| 国产亚洲精品一区二555| 开元免费观看欧美电视剧网站| 久久久久**毛片大全| 91久久久久久| 一区二区日韩精品| 国产日韩精品一区二区三区在线| 久久精品国亚洲| 蜜桃av综合| 亚洲午夜性刺激影院| 午夜精品成人在线视频| 在线欧美一区| 在线一区二区三区四区五区| 国产日韩一区二区| 亚洲国产成人久久| 国产精品久久国产三级国电话系列| 久久激情视频| 欧美精品一二三| 久久av红桃一区二区小说| 久久这里只有精品视频首页| 夜夜嗨av一区二区三区四季av| 亚洲无亚洲人成网站77777| 国语自产精品视频在线看抢先版结局| 欧美成人精品一区二区三区| 欧美日韩精品一区二区| 久久久久久有精品国产| 欧美欧美全黄| 久热re这里精品视频在线6| 欧美日韩另类字幕中文| 蜜桃av久久久亚洲精品| 国产精品久久久久av| 欧美不卡在线| 国产在线视频欧美| 亚洲天堂第二页| 日韩视频永久免费| 欧美一区中文字幕| 午夜一区二区三视频在线观看| 亚洲黄色一区二区三区| 亚洲欧洲av一区二区| 日韩视频一区二区三区| 久久成人资源| 亚洲欧美中日韩| 欧美久久视频| 亚洲第一色在线| 永久免费视频成人| 欧美一区二区观看视频| 亚洲一区二区3| 欧美黄色网络| 欧美激情精品久久久| 国产在线视频欧美一区二区三区| 一区二区精品在线| 日韩一区二区福利| 欧美高清在线一区二区| 免费中文字幕日韩欧美| 国产综合一区二区| 午夜精品久久久久久久男人的天堂| 中文亚洲字幕| 欧美日韩一区二区在线观看视频 | 欧美韩日精品| 最新中文字幕亚洲| 亚洲欧洲在线视频| 免费观看30秒视频久久| 欧美成人精品不卡视频在线观看| 国产亚洲欧美一级| 久久国产精品亚洲77777| 久久久久欧美精品| 激情五月***国产精品| 久久精品女人天堂| 另类专区欧美制服同性| 好男人免费精品视频| 久久久久久久综合日本| 另类激情亚洲| 亚洲乱码国产乱码精品精天堂 | 亚洲一区二区三区四区在线观看| 欧美精品在线观看播放| 亚洲精选大片| 午夜在线一区二区| 国产日本欧美一区二区三区| 欧美一级久久久久久久大片| 久久久久久久久久久久久久一区| 韩国一区二区三区在线观看| 久久亚洲风情| 亚洲精选一区二区| 久久不见久久见免费视频1| 韩日欧美一区二区| 欧美激情1区| 亚洲欧美视频| 欧美电影美腿模特1979在线看| 99热在线精品观看| 国产嫩草影院久久久久 | 男男成人高潮片免费网站| 亚洲精品综合精品自拍| 欧美在线日韩在线| 亚洲黄色片网站| 国产精品盗摄久久久| 欧美中文字幕在线观看| 亚洲一区二区三区四区五区午夜| 欧美在线视频一区| 欧美成熟视频| 一区二区三区精品久久久| 欧美亚男人的天堂| 久久动漫亚洲| 亚洲美女av黄| 欧美a级一区| 亚洲欧美日韩天堂| 亚洲第一久久影院| 国产精品久久久久一区| 蜜臀av性久久久久蜜臀aⅴ四虎| 9色porny自拍视频一区二区| 久久综合导航| 亚洲欧美中文日韩在线| 91久久中文字幕| 国产中文一区| 国产精品国码视频| 女女同性精品视频| 久久久久成人精品| 亚洲一区激情| 亚洲乱码精品一二三四区日韩在线 | 亚洲第一区中文99精品| 国产精品免费一区豆花| 欧美成熟视频| 久久精品一区二区| 亚洲欧美乱综合| 亚洲视频你懂的| 亚洲免费观看高清完整版在线观看熊| 久久亚洲国产成人| 欧美专区在线观看一区| 亚洲一区高清|