欢迎来到天天文库
浏览记录
ID:39468268
大小:145.00 KB
页数:7页
时间:2019-07-04
《Socket编程模型之事件选择模型》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库。
1、Socket编程模型之事件选择模型一 原理与关键函数Winsock提供了另一个有用的异步I/O模型。和WSAAsyncSelect模型类似的是,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。对于表1总结的、由WSAAsyncSelect模型采用的网络事件来说,它们均可原封不动地移植到新模型。在用新模型开发的应用程序中,也能接收和处理所有那些事件。该模型最主要的差别在于网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。跟WSAAsyncSelect类似,但是不是通过消息实现,而是通过事件对象。因为是基于
2、select实现,一个线程也只能管理64个socket。事件选择模型是基于消息的。它允许程序通过Socket,接收以事件为基础的网络事件通知。事件选择模型相关函数主要有4个,第一个是:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片WSAEVENTWSACreatEvent(void);它用来创建事件对象。如果函数成功,则返回值即是事件对象的句柄。如果函数失败,返回WSA_INVALID_EVENT。应用程序可通过调用WSAGetLastError()函数获取进一步的错误信息。主要的错误代码有:[cpp]v
3、iewplaincopy在CODE上查看代码片派生到我的代码片WSANOTINITIALISED//在调用本API之前应成功调用WSAStartup()。WSAENETDOWN//网络子系统失效。WSA_NOT_ENOUGH_MEMORY//无足够内存创建事件对象。第2个是:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片intWSAEventSelect(SOCKETs,WSAEVENThEventObject,longlNetworkEvents);WSAEventSelect模型是WindowsSoc
4、kets提供的一个有用异步I/O模型。该模型允许在一个或者多个套接字上接收以事件为基础的网络事件通知。WindowsSockets应用程序在创建套接字后,调用WSAEventSelect()函数,将一个事件对象与网络事件集合关联在一起。当网络事件发生时,应用程序以事件的形式接收网络事件通知。WSAEventSelect创建的事件拥有两种工作状态,以及两种工作模式。其中,两种工作状态分别是“已传信”(signaled)和“未传信”(nonsignaled)。工作模式则包括“人工重设”(manualreset)和“自动重设”(autor
5、eset)。WSAEventSelect最开始在一种未传信的工作状态中,并用一种人工重设模式,来创建事件句柄。随着网络事件触发了与一个套接字关联在一起的事件对象,工作状态便会从“未传信”转变成“已传信”。由于事件对象是在一种人工重设模式中创建的,所以在完成了一个I/O请求的处理之后,我们的应用程序需要负责将工作状态从已传信更改为未传信。要做到这一点,可调用WSAResetEvent函数,对它的定义如下:BOOLWSAResetEvent(WSAEVENThEvent);唯一的参数是前面用WSACreateEvent函数创建的事件对象
6、句柄,成功返回TRUE,失败返回FALSE。当应用程序完成了对一个事件对象的处理后,应调用BOOLWSACloseEvent(WSAEVENThEvent);函数释放由hEvent句柄占用的系统资源。成功返回TRUE,失败返回FALSE。第3个是:[cpp]viewplaincopy在CODE上查看代码片派生到我的代码片DWORDWSAAPIWSAWaitForMultipleEvents(DWORDcEvents,constWSAEVENTFAR*lphEvents,BOOLfWaitAll,DWORDdwTimeout,BOOL
7、fAlertable);只要指定事件对象中的一个或全部处于有信号状态,或者超时间隔到,则返回。cEvents:指出lphEvents所指数组中事件对象句柄的数目。事件对象句柄的最大值为WSA_MAXIMUM_WAIT_EVENTS。lphEvents:指向一个事件对象句柄数组的指针。fWaitAll:指定等待类型。若为真TRUE,则当lphEvents数组中的所有事件对象同时有信号时,函数返回。若为假FALSE,则当任意一个事件对象有信号时函数即返回。在后一种情况下,返回值指出是哪一个事件对象造成函数返回。dwTimeout:指定超
8、时时间间隔(以毫秒计)。当超时间隔到,函数即返回,不论fWaitAll参数所指定的条件是否满足。如果dwTimeout为零,则函数测试指定的时间对象的状态,并立即返回。如果dwTimeout是WSA_INFINITE,则函数的超时间隔
此文档下载收益归作者所有