第3章Winsock基础.pptVIP

  • 5
  • 0
  • 约1.14万字
  • 约 73页
  • 2018-04-13 发布于河南
  • 举报
第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)

1亿VIP精品文档

相关文档