完成端口

理解I/O Completion Port(完成端口)

只谈情不闲聊 提交于 2020-02-04 05:51:45
理解I/O Completion Port(完成端口) 欢迎阅读此篇IOCP教程。我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼。OK,但我不能保证你明白IOCP的一切,但我会尽我最大的努力。以下是我会在这篇文章中提到的相关技术: I/O端口 同步/异步 堵塞/非堵塞 服务端/客户端 多线程程序设计 Winsock API 2.0 在这之前,我曾经开发过一个项目,其中一块需要网络支持,当时还考虑到了代码的可移植性,只要使用select,connect,accept,listen,send还有recv,再加上几个#ifdef的封装以用来处理Winsock和BSD套接字[socket]中间的不兼容性,一个网络子系统只用了几个小时很少的代码就写出来了,至今还让我很回味。那以后很长时间也就没再碰了。 前些日子,我们策划做一个网络游戏,我主动承担下网络这一块,想想这还不是小case,心里偷着乐啊。网络游戏好啊,网络游戏为成百上千的玩家提供了乐趣和令人着秘的游戏体验,他们在线上互相战斗或是加入队伍去战胜共同的敌人。我信心满满的准备开写我的网络,于是乎,发现过去的阻塞同步模式模式根本不能拿到一个巨量多玩家[MMP]的架构中去,直接被否定掉了。于是乎,就有了IOCP,如果能过很轻易而举的搞掂IOCP,也就不会有这篇教程了

理解I/O Completion Port(完成端口)

狂风中的少年 提交于 2020-02-04 05:35:57
欢迎阅读此篇IOCP教程。我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼。OK,但我不能保证你明白IOCP的一切,但我会尽我最大的努力。以下是我会在这篇文章中提到的相关技术:   I/O端口   同步/异步   堵塞/非堵塞   服务端/客户端   多线程程序设计   Winsock API 2.0   在这之前,我曾经开发过一个项目,其中一块需要网络支持,当时还考虑到了代码的可移植性,只要使用select,connect,accept,listen,send还有recv,再加上几个#ifdef的封装以用来处理Winsock和BSD套接字[socket]中间的不兼容性,一个网络子系统只用了几个小时很少的代码就写出来了,至今还让我很回味。那以后很长时间也就没再碰了。   前些日子,我们策划做一个网络游戏,我主动承担下网络这一块,想想这还不是小case,心里偷着乐啊。网络游戏好啊,网络游戏为成百上千的玩家提供了乐趣和令人着秘的游戏体验,他们在线上互相战斗或是加入队伍去战胜共同的敌人。我信心满满的准备开写我的网络,于是乎,发现过去的阻塞同步模式模式根本不能拿到一个巨量多玩家[MMP]的架构中去,直接被否定掉了。于是乎,就有了IOCP,如果能过很轻易而举的搞掂IOCP,也就不会有这篇教程了。下面请诸位跟随我进入正题

理解I/O Completion Port(完成端口)

北慕城南 提交于 2020-02-04 05:30:26
欢迎阅读此篇IOCP教程。我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼。OK,但我不能保证你明白IOCP的一切,但我会尽我最大的努力。以下是我会在这篇文章中提到的相关技术:   I/O端口   同步/异步   堵塞/非堵塞   服务端/客户端   多线程程序设计   Winsock API 2.0   在这之前,我曾经开发过一个项目,其中一块需要网络支持,当时还考虑到了代码的可移植性,只要使用select,connect,accept,listen,send还有recv,再加上几个#ifdef的封装以用来处理Winsock和BSD套接字[socket]中间的不兼容性,一个网络子系统只用了几个小时很少的代码就写出来了,至今还让我很回味。那以后很长时间也就没再碰了。   前些日子,我们策划做一个网络游戏,我主动承担下网络这一块,想想这还不是小case,心里偷着乐啊。网络游戏好啊,网络游戏为成百上千的玩家提供了乐趣和令人着秘的游戏体验,他们在线上互相战斗或是加入队伍去战胜共同的敌人。我信心满满的准备开写我的网络,于是乎,发现过去的阻塞同步模式模式根本不能拿到一个巨量多玩家[MMP]的架构中去,直接被否定掉了。于是乎,就有了IOCP,如果能过很轻易而举的搞掂IOCP,也就不会有这篇教程了。下面请诸位跟随我进入正题

CreateIoCompletionPort

好久不见. 提交于 2019-12-20 19:46:22
创建输入/输出(I / O)完成端口并将其与指定的文件句柄相关联,或创建尚未与文件句柄相关联的I / O完成端口,从而允许以后进行关联。 将打开的文件句柄的实例与I / O完成端口相关联,可使进程接收有关该文件句柄的异步I / O操作完成的通知。 注意 此处使用的术语文件句柄是指表示重叠的I / O端点的系统抽象,而不仅仅是磁盘上的文件。任何支持重叠I / O的系统对象(例如网络端点,TCP套接字,命名管道和邮件插槽)都可以用作文件句柄。有关更多信息,请参见“备注”部分。 句法 C ++ HANDLE WINAPI CreateIoCompletionPort( _In_ HANDLE FileHandle, _In_opt_ HANDLE ExistingCompletionPort, _In_ ULONG_PTR CompletionKey, _In_ DWORD NumberOfConcurrentThreads ); 参量 FileHandle [输入] 打开的文件句柄或INVALID_HANDLE_VALUE。 该句柄必须指向支持重叠I / O的对象。 如果提供了句柄,则必须打开它才能完成I / O重叠。例如,在使用CreateFile函数获取句柄时,必须指定FILE_FLAG_OVERLAPPED标志。 如果指定了INVALID_HANDLE_VALUE

Windows 非阻塞或异步 socket

北城余情 提交于 2019-12-05 13:34:04
异步与非阻塞区别见我的另外一篇文章 Socket 同步/异步与阻塞/非阻塞区别 select WSAAsyncSelect WSAEventSelect 重叠(Overlapped)I/O IOCP:完成端口 Select 首先要使用ioctlsocket设置为非阻塞模式。 然后启动线程,线程中不停select。 WSAAsyncSelect WSAAsyncSelect模型是Windows下最简单易用的一种Socket I/O模型。使用这种模型时,Windows会把网络事件以消息的形势通知应用程序。此模型提供了读写数据能力的异步通知,但不提供异步数据传送。需要在消息响应函数里send(一般为resend)和receive。由于该模型基于Windows消息机制, 必须在应用程序中创建窗口 。虽然可以在开发中,确定是否显示该窗口。 WSAEventSelect 通常与WSACreateEvent、WSAResetEvent、WSACloseEvent、WSAWaitForMultileEvents和WSAEnumNetworkEvents一起使用,无需创建窗口。 WSAWaitForMultileEvents 检查是否有Event, WSAEnumNetworkEvents 枚举事件类型, FD_READ、 FD_WRITE等。 函数最多可以支持WSA_MAXIMUM_WAIT

完成端口中的单句柄数据结构与单IO数据结构的理解与设计

陌路散爱 提交于 2019-12-04 16:44:12
完成端口中的单句柄数据结构与单IO数据结构的理解与设计   完成端口模型,针对于WIN平台的其它异步网络模型而言,最大的好处,除了性能方面的卓越外,还在于完成端口在传递网络事件的通知时,可以一并传递与此事件相关的应用层数据。这个应用层数据,体现在两个方面:一是单句柄数据,二是单IO数据。   GetQueuedCompletionStatus函数的原型如下:   WINBASEAPI   BOOL   WINAPI   GetQueuedCompletionStatus(   IN HANDLE CompletionPort,    OUT LPDWORD lpNumberOfBytesTransferred,   OUT PULONG_PTR lpCompletionKey,   OUT LPOVERLAPPED *lpOverlapped,   IN DWORD dwMilliseconds  );   其中,我们把第三个参数lpCompletionKey称为完成键,由它传递的数据称为单句柄数据。我们把第四个参数lpOverlapped称为重叠结构体,由它传递的数据称为单IO数据。   以字面的意思来理解,lpCompletionKey内包容的东西应该是与各个socket一一对应的,而lpOverlapped是与每一次的wsarecv或wsasend操作一一对应的。  

完成端口

匿名 (未验证) 提交于 2019-12-02 23:57:01
“完成端口"利用windows内核来进行I/O的调度,是用于C/S通信模式中性能最好的通信模型,其提出的初衷是解决一个线 程一个客户端的缺点,采用少量几个线程处理和客户端的通信,消除无谓的线 程上下文切换.所谓的完成端口,其实和handle _样,是个内核对象。 完成端口的工作原理及步骤如下, 1、通过CreateloCompletionPor()创建一个完成端口,保存它的好句柄; 2、创建几个工作线程,有几个CPU就开几个工作线程,使这些线程进入等待状态; 3、当有新的socket连接时,调用CreateIoCompletionPort()将新连入的socket与创建好的完成端口进行绑定 4、当连接完成后,这些已经建立连接的socket所发送请求,都将其加入到一个公共的消息队列中,当接收完成后,通知之前事先开好的工作线程。 http://blog.csdn.net/piggyxp/article/details/6922277 来源:博客园 作者: 秋哥v 链接:https://www.cnblogs.com/socks/p/11447916.html

Windows内核原理-同步IO与异步IO

为君一笑 提交于 2019-11-28 18:48:30
目录 Windows内核原理-同步IO与异步IO 背景 目的 I/O 同步I/O 异步I/O I/O完成通知 总结 参考文档 Windows内核原理-同步IO与异步IO 背景 在前段时间检查 异常连接导致的内存泄漏排查 的过程中,主要涉及到了windows异步I/O相关的知识,看了许多包括重叠I/O、完成端口、IRP、设备驱动程序等Windows下I/O相关的知识,虽然学习到了很多东西,但是仍然需要自顶而下的将所有知识进行梳理。 目的 本片文章主要讲解同步I/O与异步I/O相关知识,希望通过编写本篇文章为起点,对windows内核原理知识进行学习与梳理。发现并弥补遗漏的知识点并加以学习。同时通过理解windows内核原理,设计出更好、更合理的应用程序。 I/O I/O即输入输出。在现在操作系统,输入输出是计算机完整功能必不可少的一部分。处理器负责各种计算任务,然后通过各种输入输出设备与外界进行交互。常见的输入输出设备包括键盘、鼠标、显示器、硬盘、网络适配器接口等。有了硬件设备,在软件层面上,使得操作系统通过以一致的方式与设备驱动交互从而的操控硬件设备。而应用程序通过统一的接口与系统内核进行交互。 Windows从一开始就设计了可扩展的I/O接口。在应用层通过统一的 Win32 API ,将I/O请求分配给正确的设备驱动程序。设备驱动程序调用设备控制器来操控硬件

Windows完成端口基本介绍

我只是一个虾纸丫 提交于 2019-11-26 02:42:17
他是只能在Windows下的基于SOCKET事件管理的模型 与select不同,select需要多次重置管理句柄,IOCP只要一次 当我们想修改服务器端口时,iis7服务器监控工具可以简单的修改端口,检测503错误 有事件后select需要操作获取数据,而IOCP通知你的时候说明数据操作好了 select管理句柄的数目有限,IOCP没有限制 IOCP支持多线程同时等待。 我的设计思路一个线程用来侦听accept事件, 一个线程来侦听SOCKET的IO事件, 大部分框架都是这样, 其实可以只使用一个线程做异步SOCKET就完全足够了,现在 使用多线程来 就是看看这个IOCP的多线程用法, 在这之前先要了解下 异步通信 和 重叠I/O模型 我建议使用单线程 原因: 应为多个线程,拿到数据后,还是要发送到另外一个线程里面去, 然后做成事件队列, 也就是你线程拿到数据后, 还是要按队列线程,进行逻辑处理,多线程没意义。 2完成端口内部运行流程 完成端口的做法:事先开好几个线程,你有几个CPU我就开几个,首先是避免了线程的上下文切换,因为线程想要 执行的时候,总有CPU资源可用,然后让几个线程等着,等到有用户请求到来的时候,就把这些请求都加入到一个 公共消息队列中, 然后这几个开好的线程就排队逐一去从消息队列中取出消息并加以处理, 这种方式实现了 异步通信和负载均衡的问题