- 1、本文档共26页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
WINDOWS MFC 网络IO模型(二).ppt
WinSock IO模型(二) 回顾 套接字I/O模型 select模型 WSAAsyncSelect模型 本章目标 WSAEventSelect模型 完成端口 WSAEventSelect 模型 基本思想: 是将每个套接字都和一个WSAEVENT对象对应起来,并且在关联的时候指定需要关注的哪些网络事件。一旦在某个套接字上发生了我们关注的事件,与之相关联的WSAEVENT对象被激发。由此就可以知道对应是哪个套接字发生了网络事件,并进行相应的处理。 WSAEventSelect原型 创建WSAEVENT对象 WSAWaitForMultipleEvents WSAEnumNetworkEvents 采用WSAEventSelect的服务器动作 WSAEventSelect例子 完成端口 完成端口全称为I/O Completion Port(IOCP),IOCP是一个异步I/O的API,它可以高效地将I/O事件通知给应用程序。与使用select()或是其它异步方法不同的是,一个套接字与一个完成端口关联了起来,然后就可继续进行正常的Winsock操作了。然而,当一个事件发生的时候,此完成端口就将被加入一个队列中。然后应用程序可以查询以得到此完成端口。 完成端口 Win32的重叠I/O机制对那些耗时的操作而言特别有用。完成端口机制针对操作系统内部进行了优化,在Windows NT和 Windows 2000上,使用了完成端口的重叠I/O机制才能够真正扩大系统的响应规模。 通常情况下,应用程序会创建一定数量的工作者线程来处理完成通知。线程数量取决于应用程序的特定需要。理想的情况是,线程数量等于处理器的数量,不过这也要求任何线程都不应该执行诸如同步读写、等待事件通知等阻塞型的操作,以免线程阻塞。 完成端口 完成端口的使用分为两步。首先创建完成端口,如以下代码所示: 完成端口 完成端口创建后,要把将使用该完成端口的套接字与之关联起来。方法是再次调用CreateIoCompletionPort ()函数, 完成端口 在创建了完成端口、将一个或多个套接字与之相关联之后,我们就要创建若干个线程来处理完成通知。这些线程不断循环调用GetQueuedCompletionStatus ()函数并返回完成通知。 当应用程序调用一个重叠操作函数时,要把指向一个overlapped结构的指针包括在其参数中。当操作完成后,我们可以通过GetQueuedCompletionStatus()函数中拿回这个指针。 完成端口 完成端口工作线程的流程如下:线程不断循环调用GetQueuedCompletionStatus ()函数并返回完成通知。当应用程序调用一个重叠操作函数时,要把指向一个overlapped结构的指针包括在其参数中。当操作完成后,可以通过GetQueuedCompletionStatus()函数中拿回这个指针。 单是根据这个指针所指向的overlapped结构,应用程序并不能分辨究竟完成的是哪个操作。 完成端口 OVERLAPPED结构类型声明如下: 完成端口 无论何时调用重叠操作函数时,总是会通过其lpOverlapped参数传递一个OVERLAPPED结构(例如WSASend、 WSARecv等函数)。这就允许你为每一个重叠调用操作设置某些操作状态信息,注意OVERLAPPED字段不要求一定是这个扩展后的结构的第一个字段。当得到了指向OVERLAPPED结构的指针以后,可以用CONTAINING_RECORD宏取出其中指向扩展结构的指针。 完成端口 使用完成端口的具体流程如下: 1.初始化Winsock 2.创建一个完成端口 3.根据服务器CPU数创建一定量的线程 4.准备好一个socket进行bind然后listen 5.进入循环accept等待客户请求 6.创建一个数据结构容纳socket和其他相关信息 7.将连进来的socket同完成端口相关联 8.投递一个准备接收的请求 使用完成端口 注意点: 1、如果重叠操作调用失败时(也就是说,返回值是SOCKET_ERROR,并且错误原因不是WSA_IO_PENDING),那么完成端口将不会收到任何完成通知。如果重叠操作调用成功,或者错误原因是WSA_IO_PENDING的错误时,完成端口将总是能够收到完成通知。 使用完成端口 注意点: 2、在套接字上使用重叠I/O接受连接的惟一API就是AcceptEx()函数。通常的同步接受函数accept()的返回值是一个新的套接字,而AcceptEx()函数则需要另外一个套接字作为它的参数之一。这是因为AcceptEx()是一个重叠操作,所以你需要事先创建一个套接字(但不要绑定或连接它),并把这个套接字
文档评论(0)