再探完成端口

Windows高效通信模型之IOCP 今晚复习计网去了...然后思考了一下怎么解决今天下午那份代码,客户端被子线程阻塞的问题。就像之前说的,那份代码是“One-thread-per-client“的模型,对每个是客户端的连接请求,都要临时创建一个socket来处理,这样就造成了系统开销比较大的问题,而且线程之间的互相阻塞也是影响效率的重要原因。 于是上网找了一下相关的信息,发现Windows下有一种号称性能最好的通信模型,叫做IOC 阅读详情
 
一 快速入门
       有关完成端口的概念,以及相关的一些API就不讨论了,因为网上介绍这些东西的文章太多了。这里关注的是如何组织代码。首先我们来看《WINDOWS网络编程技术》第八章中有关完成端口的例子。代码可以在网上找到,这里就不贴了。这个不到300行的程序可以让我们迅速入门。
 
查看程序,我们可以看到使用完成端口的服务器的一般步骤:
1.         创建一个完成端口。第四个参数保持为0,指定在完成端口上,每个处理器一次只允许执行一个工作者线程。
2.         判断系统内到底安装了多少个处理器。
3.         创建工作者线程,根据步骤2 )得到的处理器信息,在完成端口上,为已完成的I / O请求提供服务。在这个简单的例子中,我们为每个处理器都只创建两个工作者线程。
4.         准备好一个监听套接字,在端口5150上监听进入的连接请求。
5.         使用accept函数,接受进入的连接请求。
6.         创建一个数据结构,这个数据结构通常称之为完成键,同时在结构中存入接受的套接字句柄,以及其他在处理Socket IO时需要的信息,以备后用
7.         调用CreateIoCompletionPort,将自accept返回的新套接字句柄同完成端口关联到一起。通过完成键(CompletionKey)参数,将6中的数据结构传递给CreateIoCompletionPort。
8.         开始在已接受的连接上进行I/O操作。在此,我们希望通过重叠I/O机制,在新建的套接字上投递一个或多个异步WSARecv或WSASend请求。这些I/O请求完成后,一个工作者线程会为I/O请求提供服务,同时继续处理未来的I/O请求,稍后便会在步骤3 )指定的工作者例程中,体验到这一点。
9.         重复步骤5 ) ~ 8 ),直至服务器中止。
 
对于程序的分析
很明显,5-8步是关键。而在工作者线程中,如何处理IO请求也是关键。其中有两个数据结构很重要,一个就是完成键结构,另一个就是重叠IO结构。这两个结构都是指针的指针,这种晦涩的设计是为了使结构具有更好的扩展性。个人觉得理解怎么使用这两个结构就理解了完成端口编码的核心。当然,要学习操作完成端口的实现机制还是需要了解windows内核是如何维护完成队列之类更深层的东西,这些内容不在本文讨论范围之内。
 
我们可以把完成键结构看作是服务主线程accept连接时和工作者线程交互的平台。一般我们在客户端连接时会将客户端Socket句柄放入这个结构中。除此以外,所有在一次Socket IO中无法保存的数据结构都可以扔到该结构中,让它可以在多次Socket IO中重复使用。例如客户端要向服务器传文件,那么可以在完成键中添加服务器上打开的文件句柄,每次Socket IO就可以使用这个句柄读写数据。
 
我们可以把重叠IO看作是一个可以扩展的Buffer类型。这个Buffer可以根据具体的需求进行改变,它可以携带写入、写入完成、写出、写出完成的标志,也可以携带具体接受或发送的数据,等等。
 
在实际应用中,我们可以将以上两个结构设计成CompletionKey和Buffer两个类,但是要保证代表重叠IO的Buffer类指向的数据结构头部就是一个重叠结构。
 
解决了这两个结构的问题之后还有另一个问题,就是如何进行工作者线程的编程。完成端口的特点是一次数据收到之后程序会得到通知。那么怎么判断我收到的数据是完整的,可以进行下一步处理的呢?通常我们会根据已收到的数据流特征来判断它是否是完整的,对于完整的数据我们就可以进行下一步处理,而对于不完整的数据我们需要等待下次的数据,并且把它和以前的数据拼接起来。这就需要我们实现一个高效的Buffer结构来满足这些需求。当然,这些功能在Windows网络编程技术一书中给出的例子并没有实现。
 
 
二 实例分析
 
       经同事指点,我在CodeProject上找到了一个比较符合实际需求的完成端口的例子。它提供了三种类型的服务器,一是简单的EchoServer,另一个是基于自定义包结构的服务器,还有一个就是基于命令的服务器。这三个服务器只是在处理数据的逻辑上有些差异,整体架构都是一样的。
 
基于包结构的服务器和基于命令的服务器的优劣
在游戏服务器中,我们一般有自己的协议,这个协议可以基于包结构,也可以基于命令结构,可以根据需要灵活选择。通常认为包结构设计的好的话服务器和客户端只需要一个连接,而基于命令的服务器如果需要传数据,那么最好使用另一个连接,否则将会无法判断收到的是数据还是命令。但是无论使用哪一种,一个好的解析器是必要的。它可以帮助你高效地解析包内容或者是命令内容。
 
服务器的组织结构
       服务器的主体部分是一个类库工程,main函数所在工程只是继承与类库工程中的CSocketServer类来实现一些逻辑。类库工程对一些windows内核对象进行了包装,例如事件,线程等等。比较重要的部分就是CSocketServer类,Socket类,以及CIOBuffer类的实现。CSocketServer类的协作图如下:

 

 

to be continued..

完成端口模型的理解 完成端口的优点 1. 我想只要是写过或者想要写C/S模式网络服务器端的朋友,都应该或多或少的听过完成端口的大名吧,完成端口会充分利用Windows内核来进行I/O的调度,是用于C/S通信模式中性能最好的网络通信模型,没有之一;甚至连和它性能接近的通信模型都没有。 2. 完成端口和其他网络通信方式最大的区别在哪里呢? (1) 首先,如果使用“同步... 阅读详情

相关推荐

windows Socket编程之完成端口模型

上篇介绍了重叠IO模型,它已经把我们的等待数据到来和拷贝数据到我们程序的缓冲区这个时间全部交给了操作系统去完成了,它已经很完善了。但是,如果我们想要把服务端的性能做的更好一点的话,它还是有点不足的,比如说,重叠IO它只有一个工作者线程在工作,要想获得更高的效率,我们应该增加一些线程。而且,重叠IO它只能同时进行64个客户端的数据收发,这也是一个很大的问题。为此,就产生了完成端口模型,它就解决了这些

Timmiy的博客 2498

完成端口的一个例子

来自微软的完成端口例子,就讲解一下它的使用套路吧 反正编程这个玩意,只要用过,自然就知道什么回事,一次不会再看一次,学习这个玩意,无他,勤奋而已。 奢谈效率等等,那只是孰能生巧上的功夫。 这个例子是在console下的例子,算是一个echo服务器吧, 跑起来后将在5150端口监听,一旦有个端口连接上来,发个数据给服务端口,它就echo回数据给那个端口.直到那个连接...

weixin_30847271的博客 236

完成端口模型

完成端口模型步骤如下: 1.调用CreateIoCompletionPort函数创建完成端口。 HANDLE CompletionPort=CreateIoCompletionStatus(INVALID_HANDLE_VALUE,NULL,0,0); 2.创建和处理器数目相等的工作线程 SYSTEM_INFO SysInfo; GetSystemInfo(&SysInfo); for

无语的阿辉 2158

完成端口(CompletionPort)详解

一. 完成端口的优点 1. 我想只要是写过或者想要写C/S模式网络服务器端的朋友,都应该或多或少的听过完成端口的大名吧,完成端口会充分利用Windows内核来进行I/O的调度,是用于C/S通信模式中性能最好的网络通信模型,没有之一;甚至连和它性能接近的通信模型都没有。 完成端口和其他网络通信方式最大的区别在哪里呢? (1) 首先,如果使用“同步”的方式来通信的话,这里说的同步的方式就是说所有的操作都在一个线程内顺序执行完成,这么做缺点是很明显的:因为同步的通信操作会阻塞住来自同一个线程的任何其他操作,只

Fengfgg的博客 3131

《windows核心编程》读书笔记——完成端口

完成端口是windows为了处理不同设备之间并发运行时运行速度差异而设计的一种异步数据处理的机制。完成端口是《windows核心编程》中的一个重点内容,最近我花了三天时间读完核心编程里面关于完成端口的章节,并了解微软相关的技术资料文档,感觉完成端口的设计和实现可以在一定程度上加快windows的服务速度,用不用完成端口对程序逻辑没什么影响,但对于需要速度的服务来说,这就至关重要了。由于源码不公开的

行者无疆的专栏 2100

完成端口实例

将Socket和完成端口操作集成于一个类CComplatePortSocket中。提供服务端和客户端测试代码。

CreateIoCompletionPort和完成端口

摘自《Networking Programming for Microsoft Windows》第八章“完成端口”模型是迄今为止最为复杂的一种I/O模型。然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!从本质上说,完成端口模型要求我们创建一个Win32完成端口对象,通过指定数量的线程,对重叠I/O请求进行管理,以便为已经完成的重叠I/O请求提供服务

hionceshine的专栏 2万+

一个很好的完成端口(IOCP)例子

面的代码包括编写的完成端口服务器端的代码,还包括一个对服务器端进行压力测试的客户端,以及一个普通的客户端。并且带有非常详尽的代码注释的。

完成端口

从网上看到这篇文章,感觉不错,给大家转载过来,希望对大家有帮助!~最近一段日子,可以有时间到论坛看看网络编程版块了,很多关于服务器网络模型的选择,几乎有一半的人看都不看人家的去需求,直接就回用完成端口吧,我在自己的代码里用了,速度有多快之类的,看了很无语,今天有点时间,写了点个人

wang_apls的专栏 4690

AD20/Altium designer——如何进行DRC检查、冲突的错误如何改正

对于一个画完的PCB,我们常常需要进行DRC检查,确保板子的电器连接及制作工艺在设定规则的范围内,本篇将介绍如何对PCB进行后期DRC检查处理,确保电路板出现不必要错误。 1.DRC检查入口 2.DRC设置 3.错误分析 对于错误的内容,依据个人实际情况不同,其出现的原因都是因为与设计规则中的设定标准冲突,这里按遇到的错误进行修改讲解,其他错误同理。 4.常见错误分析及解决方法 (1) 解决方法:将未连接网络连接(...

嵌入式创客工坊的博客 5万+

三相SST固态变压器详细设计案例

本案例针对400kVA、30kHz三相固态变压器(SST)开展详细设计,核心采用输入串联输出并联(ISOP)拓扑架构(模块化多电平矩阵变换器M3C简化版),重点完成高频变压器的参数计算、绕组设计、损耗分析及液冷温升验证,同时覆盖系统级架构设计、半导体损耗估算及整机效率优化,全流程基于当前电力电子技术可行性展开。

qq_32103755的博客 3305

Windows完成端口编程

Windows完成端口编程目录:Windows完成端口编程... 1 目录:... 1 一 基本概念... 1 二 OVERLAPPED数据结构... 1 三 完成端口的内部机制... 2 创建完成端口... 2 完成端口线程的工作原理... 3 线程间数据传递... 4 线程的安全退出... 4   一 基本

Dean Chen的专栏 6820

万达电影 com.wandafilm.app headers check

万达电影 安卓逆向 抓包 逆向 check

weixin_43786514的博客 1438

完成端口使用总结

 前言本文不是全面介绍完成端口的,只是简单介绍了一下完成端口和几个常用概念。本文主要关注完成端口关闭时资源释放问题。基础介绍    完成端口——可能是Win32下最复杂的一种I/O模型,Win32下最复杂的内核对象。它通过指定数量的线程对重叠I/O请求进行管理,以便为已经完成的I/O请求提供服务,相对其它I/O模型,它管理任意数目I/O套接字。假若一个应用程序同时需要管理为数众多的

dananhai的专栏 3433

Cursor赋能Qt C++:从环境配置到项目构建的AI开发新范式

本文详细介绍了如何利用Cursor工具链提升Qt C++开发效率,从智能环境配置到CMake项目构建的全流程实践。通过AI辅助编程、Qt生态优化及高级调试技巧,开发者可快速完成从传统开发到AI驱动的新范式转换,显著缩短项目搭建时间并提升代码质量。

weixin_30329623的博客 547

使用TensorFlow搭建FNN(全连接神经网络)的基本步骤

提示:转载请注明出处,若本文无意侵犯到您的合法权益,请及时与作者联系。 目录 一、定义神经网络的输入输出 二、搭建神经网络 1、定义一个神经层中的权重 2、定义一个神经层中的阈值 3、定义一个神经层中的激活函数 4、组合神经层为神经网络 三、搭建损失函数和优化器 1、搭建损失函数 首先介绍第一个函数这其中用到的共同的函数为 2、定义优化器 四、训练神经网络 全连接神经网络的网络结构如下: 一、定义神经网络的输入输出 神经网络最擅长的工作就是模拟非线性函数,即一个复杂的高..

qq_41959920的博客 4070

完成端口的原理

完成端口(I/O completion):异步过程调用(apcs)问题:    只有发overlapped请求的线程才可以提供callback函数(需要一个特定的线程为一个特定的I/O请求服务)。 完成端口(I/O completion)的优点:    不会限制handle个数,可处理成千上万个连接。I/O completion port允许一个线程将一个请求暂时保存下来,由另

elybody 3586

YOLOv11模型压缩技术全面对比:剪枝、量化、蒸馏的原理与实战

YOLOv11模型压缩技术综述 模型压缩技术是解决计算资源受限环境下部署深度学习模型的关键。本文系统介绍了YOLOv11模型压缩的三种核心技术:剪枝、量化和蒸馏。剪枝技术通过移除冗余参数实现模型轻量化,包括结构化剪枝(通道/卷积核剪枝)和非结构化剪枝;量化技术通过降低数值精度(如FP32→INT8)减少存储和计算量;蒸馏技术则利用教师模型指导学生模型训练,在保持精度的同时减小模型规模。三种技术可单独或组合使用,在工业质检、智慧安防等边缘计算场景中发挥重要作用,使YOLOv11在保持80%精度的同时减少70%

本博客聚焦 YOLOv11 全流程落地,涵盖架构优化、数据集处理、训练技巧与多场景部署,兼及国产数据库、Java 开发与 AI 模型应用,内容兼顾理论与工程实践,为开发者提供系统干货,助力高效提升技术能力。 580

关于完成端口的好文章

做了一个demo测试发现,当接收了终端的http请求后,一旦回复,cmwap会自动地切断和服务器之间的连接。如果不回复,该连接会保持90秒左右后断开。因此,想和终端保持长连接是不可能的了,只能要求终端不断发心跳包保持上线,否则下发数据将无路可寻。在此情况下,使用完成端口来管理繁重的IO请求。完成端口的最大优点在于其管理海量连接时的处理效率,通过操作系统内核的相关机制完成IO处理的高效率。注意:

xuwei2007的专栏 1860

【保姆级教程】YOLOv8_OBB旋转目标检测:训练自己的数据集

【保姆级教程】YOLOv8_OBB旋转目标检测:训练自己的数据集

m0_51579041的博客 1万+

ORB-SLAM2算法4之KITTI开源数据集运行ORB-SLAM2生成轨迹并用evo工具评估轨迹

ORB-SLAM2算法1 已成功编译安装ORB-SLAM2到本地,本篇目的是用KITTI开源数据来运行ORB-SLAM2,并生成轨迹,最后用evo评估工具来评估ORB-SLAM2生成的轨迹和真值轨迹。

重点记录机器人和自动驾驶相关领域的技术,尤其是计算机视觉,视觉SLAM等,不仅有前言文献或必备算法的学习,也会有实际应用的点滴经验 2326

完成端口IOCP

完成端口IOCP 转载自:套接字I/O模型-完成端口IOCP 推荐一篇经典的对完成端口分析的文章:完成端口(CompletionPort)详解 “完成端口”模型是迄今为止最为复杂的一种I/O模型。然而,假若一个应用程序同时需要管理为数众多的套接字,那么采用这种模型,往往可以达到最佳的系统性能!但不幸的是,该模型只适用于Windows NT和Windows 2000操作系统。因其设计的复杂性,只...

XCMercy 1876

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

完成端口例子

完成端口例子                                       #include "stdafx.h" #include iostream.h> #include  #include  #include   #define PORT 5150 #define DATA_BUFSIZE 8192 

nicholasmaxwell的专栏 2777

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

上一篇: 使用标准库和函数指针简化switch语句
下一篇: 几个地址。。备用
MikeFeng
博客等级 码龄23年 27粉丝 29原创
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值