梅芳-网络编程实用教程-第7章

上传人:san****019 文档编号:21630451 上传时间:2021-05-06 格式:PPT 页数:22 大小:253KB
返回 下载 相关 举报
梅芳-网络编程实用教程-第7章_第1页
第1页 / 共22页
梅芳-网络编程实用教程-第7章_第2页
第2页 / 共22页
梅芳-网络编程实用教程-第7章_第3页
第3页 / 共22页
点击查看更多>>
资源描述
第7章 Winsock的输入/输出模型 第6章已经提到,WinSock在进行输入输出的时候,可以采用阻塞模式或非阻塞模式。使用非阻塞套接字,带有I/O操作的随机性,使非阻塞套接字难于操作,给编程带来困难。为解决这个问题,对于非阻塞的套接字工作模式,进一步引入了五种“套接字I/O模型”,它们有助于应用程序通过一种异步方式,同时对一个或多个套接字上进行的通信加以管理。 这些模型包括: select(选择) WSAAsyncSelect(异步选择) WSAEventSelect(事件选择) Overlapped I/O(重叠式I/O) Completion port(完成端口)不同的Windows平台支持不同的I/O模型。如表7.1所示: 表7.1 操作系统对套接字I/O模型的支持情况平台选择异步选择事件选择重叠式I/O完成端口Windows CE支持不支持不支持不支持不支持Windows 95 (WinSock1)支持支持不支持不支持不支持Windows 95 (WinSock2)支持支持支持支持不支持Windows 98支持支持支持支持不支持Windows NT支持支持支持支持支持Windows 2000支持支持支持支持支持 7.1 select模型 select(选择)模型是Winsock中最常见的I/O模型。它的中心思想是利用select函数,实现对多个套接字I/O的管理。利用select函数,可以判断套接字上是否存在数据,或者能否向一个套接字写入数据。只有在条件满足时,才对套接字进行输入输出操作,从而避免无功而返的I/O函数调用,避免频繁产生WSAEWOULDBLOCK错误,使输入输出变得有序。 1select的函数select的函数原型如下,其中fd_set数据类型,代表着一系列特定套接字的集合。int select(int nfds,fd_set FAR * readfds,fd_set FAR * writefds,fd_set FAR * exceptfds,const struct timeval FAR * timeout ); 2操作套接字集合的宏在应用程序中,用select对套接字进行监视之前,必须先将要检查的套接字句柄分配给某个集合,设置好相应的fd_set结构,再来调用select函数,便可知道一个套接字上是否正在发生上述的I/O活动。Winsock提供了4个宏操作,专门对fd_set数据类型进行操作(1)FD_CLR(s, *set):从set中删除套接字s。 (2)FD_ISSET(s, *set):检查s是否set集合的一名成员;如果是,则返回TRUE。(3)FD_SET(s, *set):将套接字s加入集合set。(4)FD_ZERO ( *set):将set初始化成空集合。其中,参数s是一个要检查的套接字,参数set是一个fd_set集合类型的指针。例如,调用select函数前,可使用FD_SET宏,将指定的套接字加入到fd_read集合中,select函数完成后,可使用FD_ISSET宏,来检查该套接字是否仍在fd_read集合中。 3select模型的操作步骤用select操作一个或多个套接字句柄,一般采用下述步骤:(1)使用FD_ZERO宏,初始化自己感兴趣的每一个fd_set集合。(2)使用FD_SET宏,将要检查的套接字句柄添加到自己感兴趣的每个fd_set集合中,相当在指定的fd_set集合中,设置好要检查的I/O活动。 (3)调用select函数,然后等待。select完成返回后,会修改每个fd_set结构,删除那些不存在待决I/O操作的套接字句柄,在各个fd_set集合中返回符合条件的套接字。 (4)根据select的返回值,使用FD_ISSET宏,对每个fd_set集合进行检查,判断一个特定的套接字是否仍在集合中,便可判断出哪些套接字存在尚未完成(待决)的I/O操作。(5)知道了每个集合中“待决”的I/O操作之后,对相应的套接字的I/O进行处理,然后返回步骤1,继续进行select处理。 7.2 WSAAsyncSelect异步I/O模型异步I/O模型通过调用WSAAsyncSelect()函数实现。利用这个模型,应用程序可在一个套接字上,接收以Windows消息为基础的网络事件通知。该模型最早出现于Winsock的1.1中,以适应其多任务消息环境。 1WSAAsyncSelect函数函数的定义是:int WSAAsyncSelect( SOCKET s, HWND hWnd, unsigned int wMsg, long lEvent); 2窗口回调例程 应用程序在一个套接字上调用WSAAsyncSelect函数时,该函数的hWnd参数指定了一个窗口句柄。函数成功调用后,当指定的网络事件发生时,会自动执行该窗口对应的窗口回调例程。并将网络事件通知和Windows消息的相关信息,传递给该例程的入口参数,用户可以在该例程中添加自己的代码,针对不同的网络事件进行处理,从而实现有序的套接字输入和输出。 窗口回调例程应定义成如下形式:LRESULT CALLBACK WindowProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam); 7.3 WSAEventSelect事件选择模型 WSAEventSelect事件选择模型和WSAAsyncSelect模型类似,它也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知。表7.2总结的、由WSAAsyncSelect模型采用的网络事件,均可原封不动地移植到事件选择模型中。也就是说,在用新模型开发的应用程序中,也能接收和处理所有那些事件。该模型最主要的差别在于,网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。 1创建事件对象句柄事件选择模型要求应用程序针对每一个套接字,首先创建一个事件对象。创建方法是调用WSACreateEvent函数,它的定义如下:WSAEVENT WSACreateEvent(void);函数的返回值很简单,就是一个创建好的事件对象句柄。 2关联套接字和事件对象,注册关心的网络事件有了事件对象句柄后,接下来必须将其与某个套接字关联在一起,同时注册感兴趣的网络事件类型(表7.2),这就需要调用WSAEventSelect函数,函数的定义为:int WSAEventSelect(SOCKET s,WSAEVENT hEventObject,long lNetworkEvents); 调用:WSAAsyncSelect(s, hwnd, WM_SOCKET, FD_CONNECT|FD_READ|FD_WRITE|FD_CLOSE); 表7.2 用于WSAAsyncSelect函数的网络事件类型事件类型含 义FD_READ应用程序想要接收有关是否有数据可读通知,以便读入数据FD_WRITE应用程序想要接收有关是否有可写通知,以便发送数据FD_OOB应用程序想要接收是否有OOB数据抵达的通知FD_ACCEPT应用程序想要接收与进入的连接请求有关的通知FD_CONNECT应用程序想要接收一次连接请求操作已经完成的通知FD_CLOSE应用程序想要接收与套接字关闭有关的通知 3. 等待网络事件触发事件对象句柄的工作状态将一个套接字同一个事件对象句柄关联在一起以后,应用程序便可以调用WSAWaitForMultipleEvents函数,等待网络事件触发事件对象句柄的工作状态。该函数用来等待一个或多个事件对象句柄,当其中一个或所有句柄进入“已传信”状态后,或在超过了一个规定的时间期限后,立即返回。该函数的定义:DWORD WSAWaitForMultipleEvents(DWORD cEvents,const WSAEVENT FAR * lphEvents,BOOL fWaitAll,DWORD dwTimeout, BOOL fAlertable); 4检查套接字上所发生的网络事件类型知道了造成网络事件的套接字后,接下来可调用WSAEnumNetworkEvents函数,检查套接字上发生了什么类型的网络事件。该函数定义如下:int WSAEnumNetworkEvents( SOCKET s,WSAEVENT hEventObject,LPWSANETWORKEVENTS lpNetworkEvents); 5处理网络事件在确定了套接字上发生的网络事件类型后,可以根据不同的情况做出相应的处理。完成了对WSANETWORKEVENTS结构中的事件的处理之后,应用程序应在所有可用的套接字上,继续等待更多的网络事件。应用程序完成了对一个事件对象的处理后,便应调用WSACloseEvent函数,释放由事件句柄使用的系统资源。函数的定义如下:BOOL WSACloseEvent(WSAEVENT hEvent);该函数也将一个事件句柄作为自己唯一的参数,并会在成功后返回TRUE,失败后返回FALSE。 7.4 其他模型 在Winsock中,重叠I/O(Overlapped I/O)模型能使应用程序达到更佳的性能。重叠模型的基本原理是让应用程序使用一个重叠的数据结构,一次投递一个或多个Winsock的I/O请求。针对那些提交的请求,在它们完成之后,应用程序可为它们提供服务。自Winsock 2.0发布开始,重叠I/O便已集成到新的Winsock函数中,比如WSASend和WSARecv等。因此,重叠I/O模型适用于安装了Winsock 2.0的所有Windows平台。 “完成端口”模型是迄今为止最为复杂的一种I/O模型。然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!该模型只适用于Windows NT和Windows 2000操作系统。因其设计的复杂性,只有在你的应用程序需要同时管理数百乃至上千个套接字的时候,而且希望随着系统内安装的CPU数量的增多,应用程序的性能也可以线性提升时,才应考虑采用“完成端口”模型。
展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 图纸专区 > 课件教案


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!