网络编程技术_第8章-2.ppt

  1. 1、本文档共104页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
网络编程技术_第8章-2.ppt

网络编程技术;;WSAEventSelect模型;WSAEventSelect模型;使用步骤;;3、等待网络事件来触发事件句柄的工作状态: DWORD WSAWaitForMultipleEvents( DWORD cEvents, const WSAEVENT FAR * lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable ) cEvents:事件句柄的数目,其最大值为WSA_MAXIMUM_WAIT_EVENTS = 64 lpEvent:事件句柄数组 fWaitAll:指定等待类型: TRUE:当lphEvent数组所有事件对象同时有信号时返回; FALSE:任一事件有信号就返回。 dwTimeout:等待时间(毫秒),WSA_INFINTE为无限大,当该参数为0时,用于测试事件对象状态。 fAlertable:指定此等待函数是否在提交重叠I/O请求后执行完全例程。若为TRUE,则在系统执行I/O完全例程时,此函数直接返回WSA_WAIT_IO_COMPLETION而不等待事件发生 ;失败返回WSA_WAIT_FAILED; 超时返回WSA_WAIT_TIMEOUT; 成功返回时返回值范围为:WSA_WAIT_EVENT_0 to (WSA_WAIT_EVENT_0 + cEvents - 1),应用程序可引用事件数组中有信号的事件,并检索与之对应的套接字,判断到底是在哪个套接字上,发生了什么网络事件类型。 对事件数组中的某个事件进行引用时(此时fWaitAll= FALSE),应该用WSAWaitForMultipleEvents的返回值,减去预声明值WSA_WAIT_EVENT_0,得到具体的事件索引。 例如:  Index= WSAWaitForMultipleEvents(...);  MyEvent = EventArray[Index- WSA_WAIT_EVENT_0]; ;4、判断网络事件类型: int WSAEnumNetworkEvents( SOCKET s, WSAEVENT hEventObject, LPWSANETWORKEVENTS lpNetworkEvents ) s为套接字 hEventObject:与s对应的事件对象句柄,调用后该事件对象被重置,即事件和错误清0。 lpNetworkEvents:调用后,这里记录了套接字s 对应事件对象中保存的网络事件和错误代码, ;LPWSANETWORKEVENTS其结构定义如下: typedef struct _WSANETWORKEVENTS { long lNetworkEvents; int iErrorCode[FD_MAX_EVENTS]; } WSANETWORKEVENTS, FAR * LPWSANETWORKEVENTS; ;判断是何种事件: //假设NetworkEvents是取回来的事件和错误 if (NetworkEvents.lNetworkEvents FD_READ) { //进行数据读取 } 判断是何种错误: 针对每个网络事件类型,都存在着一个特殊的事件索引,名字与事件类型的名字类似,只是要在事件名字后添加一个“_BIT”后缀字串即可。如对FD_READ事件类型来说,iErrorCodes数组的索引标识符便是FD_READ_BIT。 比如:检查FD_READ事件是否发生错误,可以用 if(NetworkEvents.iErrorCode[FD_READ_BIT ]!= 0) { //错误处理 };;; 使用WSAEventSelect模型编程的基本步骤: 创建一个事件句柄表和一个对应的套接字句柄表。 每创建一个套接字,就创建一个事件对象,把它们的句柄分别放入上面的两个表中,并调用WSAEventSelect将二者关联起来。 调用WSAWaitForMultipleEvents在所有事件对象上等待(bWaitAll = FALSE),函数返回后,从第一个有信号的事件对象开始检查事件对象表中的事件对象是否有信号(再次调用WSAWaitForMultipleEvents )。 调用WSAEnumNetworkEvents(),获取套接字上相应的网络事件并处理,然后继续在事件对象上等待。 ;WSAEventSelect优缺点;WSAEventSelect模型实例;#include winsock2.h #include stdio.h #define PORT 5150 #define M

文档评论(0)

xinshengwencai + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

版权声明书
用户编号:5311233133000002

1亿VIP精品文档

相关文档