WinSock I/O模型 WSAEventSelect模型
\r
《网络程序设计》
2
回顾:WSAAsyncSelect模型
WSAAsyncSelect模型特点:\r 将套接字绑定到窗口句柄,将网络事件与Windows消息关联。当套接字有网络事件发生时,将网络事件以Windows消息的形式派发给绑定的窗口,然后在窗口函数WindowProc中处理Windows消息(即网络事件)。
3
WinSock I/O模型-WSAEventSelect模型
WSAEventSelect模型原理\rWSAEventSelect函数\rWSAWaitForMultipleEvents函数\rWSAEnumNetworkEvents函数\rWSAEventSelect模型编程\rWSAEventSelect模型小结\r动手实践
4
WinSock I/O模型-WSAEventSelect模型
WSAEventSelect模型原理\rWSAEventSelect函数\rWSAWaitForMultipleEvents函数\rWSAEnumNetworkEvents函数\rWSAEventSelect模型编程\rWSAEventSelect模型小结\r动手实践
5
1. WSAEventSelect模型原理
WSAEventSelect模型(事件选择模型)与WSAAsyncSelect模型类似,可让应用程序在一个或多个套接字上接收网络事件。\r 其接收的网络事件也是FD_XXX类型,不过它依靠的不是Windows消息驱动机制,而是事件对象。
6
1. WSAEventSelect模型原理
需要说明的是,该模型中使用的事件对象结构,也是高性能I/O模型-重叠模型和完成端口模型中的重要数据结构。\r 所以理解事件选择模型,也有助于自学时理解重叠模型和完成端口模型的原理。
7
1. WSAAsyncSelect模型原理
WSAEventSelect模型原理图
8
WinSock I/O模型-WSAEventSelect模型
WSAEventSelect模型原理\rWSAEventSelect函数\rWSAWaitForMultipleEvents函数\rWSAEnumNetworkEvents函数\rWSAEventSelect模型编程\rWSAEventSelect模型小结\r动手实践
9
2. WSAEventSelect函数
WSAEventSelect函数为套接字及其网络事件关联一个事件对象(Event对象),当有网络事件发生时,相应的事件对象变为受信状态,然后就可以从受信的事件对象中获取网络事件详情。\r int WSAEventSelect(\r SOCKET s, //套接字句柄\r WSAEVENT hEventObject,//事件对象句柄\r long lNetworkEvents //感兴趣的网络事件组合\r //(如FD_ACCEPT|FD_CLOSE)\r ); \r 返回值:①调用成功,返回0\r ②失败,返回SOCKET_ERROR;\r 可调用WSAGetLastError()获取错误码。
10
WinSock I/O模型-WSAEventSelect模型
WSAEventSelect模型原理\rWSAEventSelect函数\rWSAWaitForMultipleEvents函数\rWSAEnumNetworkEvents函数\rWSAEventSelect模型编程\rWSAEventSelect模型小结\r动手实践
11
3. WSAWaitForMultipleEvents函数
网络事件与事件对象关联后,应用程序在事件对象上等待,以检测有哪些事件对象处于受信状态。\r DWORD WSAWaitForMultipleEvents(\r DWORD cEvents, //指定下面数组中事件对象句柄的个数\r const WSAEVENT *lphEvents, //指向一个事件对象句柄数组\r BOOL fWaitAll, //是否等待所有的事件对象都变为受信状态\r DWORD dwTimeout, //指定要等待的时间(毫秒),\r //WSA_INFINITE表示无限大\r BOOL fAlertable //在使用WSAEventSelect模型时忽略该参数\r //(设为FALSE)\r );
12
3. WSAWaitForMultipleEvents函数
WSAWaitForMultipleEvents最多支持WSA_MAXIMUM_WAIT_EVENTS个事件对象,即64个。如果要管理多个套接字,就需要创建额外的工作线程。
13
3. WSAWaitForMultipleEvents函数
WSAWaitForMultipleEvents会等待网络事件的发生:\r(1) 如果等待超时,则返回WSA_WAIT_TIMEOUT;\r(2) 如果在指定时间内有网络事件发生,返回值会指明是哪一个对象受信导致函数返回;\r(3) 如果函数调用失败,则返回WSA_WAIT_FAILED。
14
3. WSAWaitForMultipleEvents函数
\r 注意:将fWaitAll设为FALSE时,如果同时有多个事件对象受信,返回值也只能指明一个,即数组中最前面的那个事件对象。
15
3. WSAWaitForMultipleEvents函数
问题:使用WSAWaitForMultipleEvents()轮询事件对象数组时,如果这个事件对象一直受信(总有网络事件发生),则后面其它事件对象对应的套接字的网络事件就得不到处理了。\r 解决:当调用WSAWaitForMultipleEvents()返回后不直接进行网络事件处理,而是再次遍历每个事件对象,针对每个事件对象调用WSAWaitForMultipleEvents()函数,以确定其受信状态。
16
WinSock I/O模型-WSAEventSelect模型
WSAEventSelect模型原理\rWSAEventSelect函数\rWSAWaitForMultipleEvents函数\rWSAEnumNetworkEvents函数\rWSAEventSelect模型编程\rWSAEventSelect模型小结\r动手实践
17
4. WSAEnumNetworkEvents函数
一旦知道受信的事件对象,根据数组元素索引号就可以找到对应的套接字,然后可以调用WSAEnumNetworkEvents()函数,查看到底发生了什么网络事件。\r int WSAEnumNetworkEvents(\r SOCKET s, //套接字句柄\r WSAEVENT hEventObject, //对应的事件对象句柄\r LPWSANETWORKEVENTS lpNetworkEvents //出参:指向一个 \r //WSANETWORKEVENTS结构,存储网络事件和相关出错码\r );\r 返回值:①调用成功,返回0;\r ②失败,返回SOCKET_ERROR;\r 可调用WSAGetLastError()获取错误码。
18
4. WSAEnumNetworkEvents函数
WSANETWORKEVENTS结构定义如下:\r typedef struct _WSANETWORKEVENTS {\r long lNetworkEvents; //指定发生的网络事件,如FD_READ|FD_WRITE等\r int iErrorCode[FD_MAX_EVENTS];\r //与lNetworkEvents网络事件对应的出错码\r } WSANETWORKEVENTS, *LPWSANETWORKEVENTS;\r
19
WinSock I/O模型-WSAEventSelect模型
WSAEventSelect模型原理\rWSAEventSelect函数\rWSAWaitForMultipleEvents函数\rWSAEnumNetworkEvents函数\rWSAEventSelect模型编程\rWSAEventSelect模型小结\r动手实践
20
5.WSAEventSelect模型编程
5.1 效果演示\r
21
5.WSAEventSelect模型编程
5.2 使用WSAAsynceSelect模型编写TCP服务器示例\r
22
5.WSAEventSelect模型编程
5.3 测试WSAAsyncSelect模型TCP服务器\r 使用以前编写的TCP客户端程序进行连接/通信测试,观察运行效果。\r
23
WinSock I/O模型-WSAEventSelect模型
WSAEventSelect模型原理\rWSAEventSelect函数\rWSAWaitForMultipleEvents函数\rWSAEnumNetworkEvents函数\rWSAEventSelect模型编程\rWSAEventSelect模型小结\r动手实践
24
6.WSAEventSelect模型小结
WSAEventSelect模型特点:\r 将套接字绑定到事件对象,当套接字有网络事件发生时,对应的事件对象变为受信状态,然后从受信的事件对象中获取网络事件详情,并对网络事件进行处理。
25
WinSock I/O模型-WSAEventSelect模型
WSAEventSelect模型原理\rWSAEventSelect函数\rWSAWaitForMultipleEvents函数\rWSAEnumNetworkEvents函数\rWSAEventSelect模型编程\rWSAEventSelect模型小结\r动手实践
26
5.动手实践
动手实践环节
(1)认真阅读、分析、理解示例中的TCP服务器代码;\r(2)修改并测试代码,要求服务器监听8010端口,服务器收到信息后进行显示,并发送“你好,我是WSAEventSelect模型服务器!”给客户端。\r(3)让邻座的同学使用客户端连接你的服务器,进行测试。
27
课后作业
简述WSAEventSelect模型特点。\r请描述WSAEventSelect()函数的功能,并解释其参数和返回值的意义。\r请描述WSAWaitForMultipleEvents()函数的功能,并解释其参数和返回值的意义。\r请描述WSAEnumNetworkEvents()函数的功能,并解释其参数和返回值的意义。\r\r
网络程序设计基础
谢谢!