2022年Winsock的IO模型 .pdf

上传人:C****o 文档编号:39745452 上传时间:2022-09-07 格式:PDF 页数:3 大小:36.28KB
返回 下载 相关 举报
2022年Winsock的IO模型 .pdf_第1页
第1页 / 共3页
2022年Winsock的IO模型 .pdf_第2页
第2页 / 共3页
点击查看更多>>
资源描述

《2022年Winsock的IO模型 .pdf》由会员分享,可在线阅读,更多相关《2022年Winsock的IO模型 .pdf(3页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、winsocket 的同步阻塞结合多线程方便简单设计节点服务器,但是真要弄出个高效并发的服务器还得考虑下异步阻塞或非阻塞机制。winsocket 引入了几个套接字I/O 模型,分别如下:1.select 模型:避免了异步机制实时返回WSAEWOULDBLOCK 的错误(无功而返),该方法通过定义套接字、套接字集合变量,循环清除套接字集合变量、将套接字添加至集合,使用select函数选择符合参数规定条件的套接字,保留符合条件的套接字删除不符合条件的,依据其返回值判断所定义的套接字是否还在套接字集合里边,如果在则说明选到了符合条件的套接字,可对该套接字进行操作。2.WSAAsyncSelect异步

2、 I/O 模型:利用windows 的消息机制,使用WSAAsyncSelect()函数,通过指定套接字上感兴趣的网络事件,一旦该网络事件发生,发送指定消息到窗体,窗体回调函数接受该消息并处理该套接字上的事件(连接请求、读取数据、发送数据、关闭套接字)。3.WSAEventSelect事件选择模型:他和WSAAsyncSelect模型类似,他也允许应用程序在一个或多个套接字上,接收以事件为基础的网络事件通知,差别在于网络事件会投递至一个事件对象句柄,而非投递至一个窗口例程。4.重叠 I/O 模型:重叠模型的基本原理是让应用程序使用一个重叠的数据结构,一次投递一个或者多个Winsock 的 I/

3、O 请求,针对那些提交的请求,在他们完成之后,用用程序可以为他们提供服务,有事件通知和完成例程(回调函数)两种方式。其步骤为:事件通知方式:1.定义变量.包括套接字,重叠变量,事件数组.2.创建监听套接字,绑定地址,在制定的端口上监听连接请求.3.接受一个客服端的连接请求accept();4.创建事件数组,初始化重叠结构,关联事件(重叠结构关联的事件),buffer 初始化。5.以 WSAOVERLAPPED 结构为参数,在套接字上投递WSARecv请求。6.调用 WSAWaitForMultipleEvents 函数,等待重叠操作返回的结果。7.使用 WSAResetEvent函数重设当前这

4、个用完的事件对象。8.使用 WSAGetOverlappedResult 函数取得重叠调用的返回状态。9.使用接受的数据,buffer 结构里接受到了数据可使用。10.回到第 5,在套接字上继续投递WSARecv请求,重复步骤6-9.名师资料总结-精品资料欢迎下载-名师精心整理-第 1 页,共 3 页 -完成例程处理(回调函数处理)方式:1.新建一个监听套接字,在制定的端口监听客户端的连接请求。2.接受一个客户端的连接请求,并返回一个会话套接字负责与客户端的连接请求。3.为会话套接字关联一个WSAOVERLAPPED 结构。4.在套接字上投递一个异步WSARecv请求,方法是将 WSAOVER

5、LAPPED 指定成为参数,同时提供一个完成例程。5.在将 falertable 参数设为TURE的前提下,调用WSAWaitForMultipleEvents,并等待 一 个 重 叠I/O请 求 完 成。重 叠 请 求 完 成 后,完 成 例 程 会 自 动 执 行,而 且WSAWaitForMultipleEvents 会返回一个WAIT_IO_COMPLITION.在完成例程内,可随一个完成例程一道投递另一个重叠WSARecv请求。6.检查 WSAWaitForMultipleEvents 是否返回WAIT_IO_COMPLIETION.7.重复步骤5-6.重叠 IO 模型的缺点是为每一

6、个IO 请求都开了一个线程,当同时有成千上万个请求发生时,系统处理线程上下文切换是非常耗时的。所以这也就引出了先进的完成端口模型IOCP.用线程池来解决这个问题。5.完成端口(IOCP)模型:完成端口IO 模型是应用程序使用线程池处理异步IO 请求的一种机制。首先创建一个win32 完成端口对象,再创建一定数量的工作线程,应用程序发出一些异步IO 请求,当这些请求完成时,系统将把这些工作项目安排到完成端口,这样,在完成端口上等待的线程池便可以处理这些完成的IO,为已经完成的重叠IO 请求提供服务。所谓的完成端口是一个windows I/O 结构,可以接受多种I/O 对象的句柄,如文件对象,套接

7、字对象等。IOCP的基本步骤:1.调用 CreatIoCompletionPort函数,创建一个完成端口。忽略前三个参数,第四个参数为零,旨在创建一完成端口对象,同时指定在完成端口上,每个处理器一次只允许执行一个工作者线程。2.判断系统内到底安装了多少个处理器。3.创建工 作者 线程,在 完成端 口上,为 已完 成的IO 请求 提供服 务(调用GetQueuedCompletionStatus()注意单句柄数据和单I/O 操作数据的使用)。4.监听套接字-绑定-监听名师资料总结-精品资料欢迎下载-名师精心整理-第 2 页,共 3 页 -5.使用 accept 函数,接受进入的连接请求。6.创建

8、一个数据结构,用于容纳单句柄数据,同时在结构中存入接受的套接字句柄。7.再次调用 CreatIoCompletionPort 函数,将自accept 返回的新套接字句柄同完成端口关联到一起。通过完成键(CompletionKey)参数,将单句柄数据结构传递给函数。8.开始在已接受的连接上进行io 操作。通过重叠io 机制,在新建的套接字上投递一个或者多个异步WSARecv或者 WSASend请求。这些 io 请求完成后,一个工作线程会为io 请求提供服务。同时继续处理未来的io 请求。9.重复 5-8 至终止。分别于主线程循环阻塞accept();于工作线程循环阻塞GetQueuedCompletionStatus();不停地发出异步的WSASend/WSARecv IO 操作,具体的io 处理过程由windows 系统完成,WINDOWS 系统完成实际的io 处理后,把结果送到完成端口上。如果有多个io 都完成了那么就在完成端口那里排成一个队列。在另外一个线程里从完成端口不断地取出io 操作结果,然后根据需要在发出WSASend/WSARecv IO 操作。IOCP模型最大的特色是:线程的服务单位被分割了,从传统的以用户为服务单位转为以IO操作为服务单位名师资料总结-精品资料欢迎下载-名师精心整理-第 3 页,共 3 页 -

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高考资料

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

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁