第3章Winsock基础.ppt

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

  其中:   参数s标识请求事件通知的套接字的描述符;   参数hWnd标识网络事件发生时,接收消息的窗口的句柄;   参数wMsg为网络事件发生时,窗口接收到的消息;   参数lEvent为指定应用程序感兴趣的网络事件组合的位屏蔽,可由表3.1中所列的值组成。 表3.1 IEvent可用事件 3.3.3 WSAEventSelect模型   WSAEventSelect模型是WinSock提供的另一个有用的异步I/O模型,与WSAAsyncSelect模型类似的是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知,并且它支持的网络事件与WSAAsyncSelect模型一样。它与WSAAsyncSelect模型的主要区别在于网络事件会被发送到一个事件对象句柄,而不是发送到一个窗口。   首先,调用函数WSACreateEvent()创建事件对象来接收网络事件,其函数原型为   WSAEVENT WSACreateEvent(void);     其返回值是一个事件对象句柄,该事件有两种工作状态“已传信(signaled)”和“未传信(nonsignaled)”及两种工作模式“人工重设(manual reset)”和“自动重设(auto reset)”。默认状态下事件处于“未传信”的工作状态和“人工重设”模式。   其次,要调用WSAEventSelect()函数将创建的事件对象与某个套接字关联在一起,同时注册感兴趣的网络事件类型,使事件对象的工作状态从“未传信”转变成“已传信”。WSAEventSelect()函数原型为   int WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents); 其中:   参数s为一个标识套接字的描述字;   参数hEventObject用于指定与所提供的FD_XXX网络事件集合相关的一个事件对象句柄;   参数lNetworkEvents是一个屏蔽位,用于指定感兴趣的FD_XXX网络事件组合。   由于事件对象创建后默认处于人工重设模式,因此在完成一个I/O请求的处理之后,应用程序需要调用WSAResetEvent函数将事件对象的工作状态从“已传信”更改为“未传信”。WSAResetEvent()函数原型为   BOOL WSAResetEvent( WSAEVENT hEvent);   其中:参数hEvent是一个事件句柄,成功则返回TRUE,失败则返FALSE。   一个套接字与一个事件对象句柄关联在一起后,应用程序就可以通过WSAWaitForMultipleEvents()函数等待网络事件来触发事件句柄的工作状态,进行I/O处理,其原型为 DWORD WSAWaitForMultipleEvents( DWORD cEvents, const WSAEVENT FAR *lphEvents, BOOL fWaitAll, DWORD dwTimeout, BOOL fAlertable ); 其中:   参数lphEvents为指向一个事件对象句柄数组的指针。   参数cEvents指出lphEvents所指向的数组中事件对象句柄的数目,事件对象句柄数组的最大值为WSA_MAXIMUM_WAIT_EVENTS。   参数fWaitAll指定等待类型,若为TRUE,则当lphEvents数组中的所有事件对象同时有信号时,函数返回;若为FALSE,则当任意一个事件对象有信号时函数就返回。后一种情况返回值指出是哪一个事件对象造成函数返回。通常把该参数设置为FALSE,一次只为一个套接字事件提供服务。   参数dwTimeout指定超时等待时间(以毫秒计),若超时间隔到,不论fWaitAll参数所指定的条件是否满足,函数即返回。如果dwTimeout为零,则函数测试指定事件对象的状态,并立即返回。如果dwTimeout为WSA_INFINITE,则函数的超时间隔永远不会到。   参数fAlertable指定当系统将一个I/O完成例程放入队列以供执行时,函数是否返回,若为TRUE,则函数返回并执行完成例程;若为FALSE,则函数不返回且不执行完成例程。在Win 16中应忽略该参数。   返回值:如果函数调用成功,则指出造成函数返回的事件对象;如果函数调用失败,则返回值为WSA_WAIT_FAILED。   这样,应用程序就可引用事件数组中已传信的事件,并检索与那个事件对应的套接字,判断到底是在哪个套接字上,发生了什么网络事件类型。对事件数组中的事件进行引用时,应该用WSAWaitForMultipleEvents的返回值,减去预声明值WSA_WAIT_EVENT_0,

文档评论(0)

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

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

版权声明书
用户编号:8130065136000003

1亿VIP精品文档

相关文档