完成端口相关API介绍

IOCP---完成端口(CompletionPort) 假若—个应用程序同时需要管理为数众多的套接字,那么“完成端口”模型。往往可以达到最佳的系统性能,然而不幸的是,该模型只适用于以下操作系统(微软的):Windows NT和Windows 2000操作系统。因其设计的复杂性,只有在应用程序需要同时管理数百乃至上千个套接字的时候、而且希望随着系统内安装的CPU数量的增多、应用程序的性能也可以线性提升,才应考虑采用“完成端口”模型。要记住的一个基本准则是... 阅读详情
在Windows系统里,使用完成端口是高性能的方法之一,比如把完成端口使用到线程池和网络服务器里。现在就通过线程池的方法来介绍怎么样使用完成端口,高性能的服务器以后再仔细地介绍怎么样构造它。其实完成端口是一个队列,所有的线程都在等消息出现,如果队列里有消息,就每个线程去获取一个消息执行它。先用函数CreateIoCompletionPort来创建一个消息队列,然后使用GetQueuedCompletionStatus函数来从队列获取消息,使用函数PostQueuedCompletionStatus来向队列里发送消息。通过这三个函数就实现完成端口的消息循环处理。
 
函数CreateIoCompletionPort、GetQueuedCompletionStatus、PostQueuedCompletionStatus声明如下:
 
WINBASEAPI
__out
HANDLE
WINAPI
CreateIoCompletionPort(
    __in     HANDLE FileHandle,
    __in_opt HANDLE ExistingCompletionPort,
    __in     ULONG_PTR CompletionKey,
    __in     DWORD NumberOfConcurrentThreads
    );
WINBASEAPI
BOOL
WINAPI
GetQueuedCompletionStatus(
    __in HANDLE CompletionPort,
    __out LPDWORD lpNumberOfBytesTransferred,
    __out PULONG_PTR lpCompletionKey,
    __out LPOVERLAPPED *lpOverlapped,
    __in DWORD dwMilliseconds
    );
 
WINBASEAPI
BOOL
WINAPI
PostQueuedCompletionStatus(
    __in     HANDLE CompletionPort,
    __in     DWORD dwNumberOfBytesTransferred,
    __in     ULONG_PTR dwCompletionKey,
    __in_opt LPOVERLAPPED lpOverlapped
    );
FileHandle是关联的文件句柄。
ExistingCompletionPort是已经存在的完成端口。
CompletionKey是传送给处理函数的参数。
NumberOfConcurrentThreads是有多少个线程在访问这个消息队列。
CompletionPort是已经存在的完成端口。
lpCompletionKey是传送给处理函数的参数。
lpOverlapped是传送给处理函数的参数。
dwMilliseconds是等待时间。
dwNumberOfBytesTransferred是传送了多少个字节。
 
调用函数的例子如下:
#001 #pragma once
#002 
#003 #include "Thread.h"
#004 
#005 
#006 //使用IOCP实现线程池。
#007 //蔡军生 2007/10/29 QQ:9073204 深圳
#008 class CThreadPools
#009 {
#010 public:
#011 
#012  CThreadPools(void)
#013  {
#014          m_nThreadCount = 2;
#015   }
#016 
#017  ~CThreadPools(void)
#018  {
#019  }
#020 
#021  bool Init(void)
#022  {
#023         //创建一个IOCP。
#024         m_hQueue = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, m_nThreadCount);
#025         if (m_hQueue == NULL)
#026         {
#027               //创建IOCP失败。
#028               return false;
#029         }
#030  }
#031 
#032  int GetThreadCount(void) const
#033  {
#034         return m_nThreadCount;
#035  }
#036 
#037  //线程池处理的内容。
#038  DWORD Run(void)
#039  {
#040         DWORD dwBytesTransfered;
#041         ULONG_PTR dwCompletionKey;
#042 
#043         OVERLAPPED* pOverlapped;
#044 
#045         //等一个IOCP的消息。
#046        while (GetQueuedCompletionStatus(m_hQueue, &dwBytesTransfered, &dwCompletionKey, &pOverlapped, INFINITE))
#047         {
#048               if (pOverlapped == ((OVERLAPPED*) ((__int64) -1)) )
#049               {
#050                    //退出。
#051                    OutputDebugString(_T("退出 /r/n"));
#052                    break;
#053               }
#054               else                                            
#055        
#056               {
#057                    WPARAM request = (WPARAM) dwCompletionKey;
#058 
#059                    //处理消息。
#060                    OutputDebugString(_T("GetQueuedCompletionStatus /r/n"));
#061               }
#062         }
#063 
#064         return 0;
#065  }
#066 
#067  //发送处理的消息。
#068  bool QueueRequest(WPARAM wParam)
#069  {        
#070         //往IOCP里发送一条消息。
#071        if (!PostQueuedCompletionStatus(m_hQueue, 0, (ULONG_PTR) wParam, NULL))
#072         {
#073               return false;
#074         }
#075        
#076         return true;
#077  }
#078 
#079  //关闭所有线程。
#080  void Close(void)
#081  {
#082         for (int i = 0; i < m_nThreadCount; i++)
#083         {
#084               PostQueuedCompletionStatus(m_hQueue, 0, 0, (OVERLAPPED*) ((__int64) -1) );
#085         }
#086  }
#087 
#088 protected:
#089  //接收消息处理的队列。
#090  HANDLE m_hQueue;
#091 
#092  //线程个数。
#093  int m_nThreadCount;
#094 };
#095 
#096 //////////////////////////////////////////////////////////////////////////
#097 class CThreads :
#098  public CThread
#099 {
#100 public:
#101  CThreads(CThreadPools* pPool)
#102  {
#103          m_pPool = pPool;        
#104  }
#105  virtual ~CThreads(void)
#106  {
#107 
#108  }
#109 
#110 
#111 protected:
#112  //
#113  //线程运行函数。
#114  //在这里可以使用类里的成员,也可以让派生类实现更强大的功能。
#115  //蔡军生 2007/10/29
#116  virtual DWORD Run(void)
#117  {
#118         //
#119         if (m_pPool)
#120         {
#121               return m_pPool->Run();
#122         }
#123 
#124         return -1;
#125  }
#126 
#127 protected:
#128  CThreadPools* m_pPool;
#129 
#130 };
  转载地址:http://blog.youkuaiyun.com/caimouse/archive/2007/10/29/1855142.aspx
完成端口GetQueuedCompletionStatus返回值的问题  完成端口GetQueuedCompletionStatus返回值的问题先看看GetQueuedCompletionStatus函数的完整声明:BOOL GetQueuedCompletionStatus(  HANDLE CompletionPort,         LPDWORD lpNumberOfBytes,      PULONG_PTR lpCompletionKey,    L 阅读详情

相关推荐

IO模型之完成端口completion port(windows上性能最好)

文章目录1. 完成端口IOCP模型2. 完成端口IOCP模型的原理3. 使用完成端口的基本流程4. CreateloCompletionPort函数5. GetQueuedCompletionStatus函数WSAOVERLAPPED结构6. WSARecv函数7. 服务端编程8. 客户端编程 1. 完成端口IOCP模型 一个完成端口实际上就是一个通知队列,操作系统把已经完成的重叠I/0请求的通知放到队列中。完成端口会充分利用Windows最复杂的内核对象来进行I/O的调度,属于异步IO,是用于C/S通信模

超级大洋葱的博客 3535

完成端口中的GetQueuedCompletionStatus参数的含义

GetQueuedCompletionStatus 参数是完成端口的最后一关,但是其中有几个参数容易混淆,在此列出来,希望在学习完成端口的时候通过该遍文章少走弯路。     GetQueuedCompletionStatus(   comPort, //已经创建,并且绑定了客户端套接字,的完成端口[句柄] --指定句柄   &dwIOsize, //本次传输数据的大小   

学习就像吃饭一样,不可以太着急,否则就会咀嚼不完全,而不消化 3898

windows下利用完成端口(IOCP)搭建服务端网络库

服务端网络库是后端服务体系基石,网络库性能高低决定服务性能起点。本篇简介在windows下利用完成端口来搭建服务端网络库。 1. 技术选型 windows下网络IO模型大致有:select模型、WSAAsyncSelect模型、WSAEventSelect模型、重叠I/O模型、完成端口模型,共五类模型。 (一)select模型贴近底层使用socket基础函数,封装简单易开发,但性能不太高,适用小量连接。 (二)WSAAsyncSelect模型基于windows消息系统模型,和界面窗口易于配合便于开发

wyc7610的专栏 861

windows网络编程,TCP/IP协议,UDP/IP协议

适用人群windows网络编程的初学者课程概述课程简介:这部教程是windows网络编程,包括两部分:tcp/ip协议编程与udp/ip协议编程课程内容:c/s模型的编码,5种windows网络模型:select,异步选择,事件选择,重叠io,完成端口,以及基础理论知识的讲解。课程代码会带大家一行一行书写,让大家都能够学会。课程适合人群:网络编程爱好者,网络编程初学者tcp/ip协议课程章节:第一章 c/s模型的讲解以及代码实现第二章 select模型的讲解以及代码实现第三章 异步选择模型的讲解以及代码实现第四章 事件选择模型的讲解以及代码实现第五章 重叠i/o模型的讲解以及代码实现第六章 完成端口模型的讲解以及代码实现第七章 tcp/ip基础知识的讲解,包括网络分层,三次握手,四次挥手,协议头等等。udp/ip协议课程章节:第一章 c/s模型的讲解以及代码实现第二章 select模型的讲解以及代码实现第三章 异步选择模型的讲解以及代码实现第四章 事件选择模型的讲解以及代码实现第五章 重叠i/o模型的讲解以及代码实现第六章 完成端口模型的讲解以及代码实现

Windows监控文件夹中文件变化

一、Windows提供了几种方式对文件和目录进行监控,包括:FindFirstChangeNotification、ReadDirectoryChangesW、变更日志(Change Journal)等。 (1)FindFirstChangeNotification函数,可以监控到目标目录及其子目录中所有文件的变化,但不能监控到具体是哪一个文件发生改变。 (2)ReadDirectoryChang...

深之JohnChen的专栏 1万+

GetQueuedCompletionStatus

`lpCompletionKey`:指向 `DWORD` 指针,接收与完成通知关联的完成键(completion key),这个键可以用来识别特定的 I/O 操作。- `lpOverlapped`:指向 `OVERLAPPED` 结构的指针,如果 I/O 操作是重叠的,这个参数将指向关联的重叠结构。- `dwMilliseconds`:超时时间,如果设置为 0,函数会立即返回;- `lpNumberOfBytesTransferred`:指向 `DWORD` 指针,接收 I/O 操作转移的字节数。

weixin_46687533的博客 1070

【网络编程】完成端口 IOCP

执行一个文件的I/O 操作处理具有关联的I/O 完成端口,在I/O 操作完成时I/O 系统发送 完成通知包到完成端口。其次,我们需要知道,所谓的完成端口其实和 HANDLE 一样,也是一个内核对象, Windows 大师Jeff Richter曾说,“完成端口可能是最为复杂的内核对象了”,但是我们也不 用去管它复杂,因为具体的内部是如何实现的和我们无关,只要我们能够学会用它相关的API 把这个完成端口的框架搭建起来就可以了。然而,当一个事件发生的时候,此完成端口就将被操作系统加入一个队列中。

Antonio915的博客 904

Windows下CMake的下载与安装详解

目录一、CMake介绍二、CMake的下载与安装 一、CMake介绍 CMake是一个跨平台的安装(编译)工具,可以用简单的语句来描述所有平台的安装(编译过程)。它能够输出各种各样的makefile或者project文件,能测试编译器所支持的C++特性,类似UNIX下的automake。 二、CMake的下载与安装 CMake下载链接:https://cmake.org/download/。 下载最新稳定版即可(Latest Release): 下载完成后,单击“Next”按钮,在下图中勾选“I acce

Wendy的博客 8万+

Windows API一日一练(60)CreateIoCompletionPort和GetQueuedCompletionStatus函数

Windows API一日一练(60)CreateIoCompletionPort和GetQueuedCompletionStatus函数     在Windows系统里,使用完成端口是高性能的方法之一,比如把完成端口使用到线程池和网络服务器里。现在就通过线程池的方法来介绍怎么样使用完成端口,高性能的服务器以后再仔细地介绍怎么样构造它。其实完成端口是一个队列,所有的线程都在等消息出现,如果队列里有

1144

卡尔曼滤波调参避坑指南:Q/R参数怎么设?实测5种传感器场景

本文针对卡尔曼滤波在工程实践中Q/R参数设置的难题,提供了一套实用的调参避坑指南。通过分析过程噪声方差Q与测量噪声方差R的物理意义与博弈关系,并结合温度传感器、陀螺仪、超声波测距等五种典型传感器场景的实测效果对比,总结出从噪声估算、离线仿真到收敛测试的系统性调参方法论,帮助工程师快速实现稳定有效的滤波效果。

weixin_29174141的博客 801

Windows Server安装Intel I219-V网卡驱动完整教程

在Windows Server系统上安装Intel I219-V网卡驱动的方法。

小白成长历程 5172

【windows核心编程】IO完成端口(IOCP)复制文件小例前简单说明

1、关于IOCP IOCP即IO完成端口,是一种高伸缩高效率的异步IO方式,一个设备或文件与一个IO完成端口相关联,当文件或设备的异步IO操作完成的时候,去IO完成端口的【完成队列】取一项,根据完成键(Complete Key)来判断是哪个设备或文件的操作完成,然后再根据实际情况进行处理。 2、相关API 和 数据结构 将一个已完成的IO通知追加到IO...

weixin_38166557的博客 248

Maltab GUI课程设计——网络爬虫程序(基金连涨连跌提醒)

Maltab GUI课程设计——网络爬虫程序(基金连涨连跌提醒)

果果爱腰果的博客 849

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

欢迎阅读此篇IOCP教程。我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼。OK,但我不能保证你明白IOCP的一切,但我会尽我最大的努力。以下是我会在这篇文章中提到的相关技术: I/O端口 同步/异步 堵塞/非堵塞 服务端/客户端 多线程程序设计 Winsock API 2.0 在...

weixin_34206899的博客 140

openai联合创始人用1000行纯C语言手搓的GPT-2训练代码

不久之前,特斯拉前 AI 总监、OpenAI 联合创始人 Andrej Karpathy 在社交媒体平台 X 上高调宣布,他友好地从 OpenAI 离职,未来将专注于“个人项目”,而后又口口声声说要尝试性地戒掉上网两周,去了 Bhutan(不丹王国)休假。然后就手搓如下代码,我们一起来欣赏.这段代码是一个GPT-2模型的训练实现,包括前向传播、后向传播、参数更新等过程。代码中包含了注释,解释了每个函数和代码块的作用。此外,还有一些辅助函数和结构体,用于数据加载、随机数生成和模型的初始化与释放。这个训练循环还

zhangzhechun的专栏 1211

L2tp环境搭建笔记- Openwrt平台

本文使用3台openwrt设备, 分别搭建L2TP服务和2个客户端, 进行端到端验证和局域网组网,并分析搭建过程中涉及的默认路由( defaultroute) 配置问题。

十年通信老兵的技术修炼之路——从3G到5G,从地面基站到卫星通信。 3389

iocp模型

主要api a. 创建完成端口 HANDLE WINAPI CreateIoCompletionPort( HANDLE FileHandle, HANDLE ExistingCompletionPort, ULONG_PTR CompletionKey DWORD NumberOfConcurrentThreads...

weixin_30925411的博客 105

6、硬件工程师笔试面试知识器件篇——电容(2025版本)

本文系统介绍了电容器的基本原理、类型分类、应用场景及相关设计问题。首先阐述了电容的定义、工作原理及计算公式,详细分析了陶瓷、电解、薄膜、钽等不同类型电容的特性差异。针对高频电路设计,重点讨论了如何评估和优化电容器的寄生效应(ESR/ESL)、频率特性、温度特性等关键参数。文章还提供了PCB布局优化策略,包括缩短走线、多层板设计、去耦网络配置等方法。最后涵盖了电容器寿命计算、稳定性评估及电源电路设计中的纹波电流处理等实用内容,为硬件工程师提供了全面的电容器选型和应用指南。

XU157303764的博客 3869

坚持学习100天:I/O模型的网络开发

前言 Hello,我是修齊。 学习C++的第一百零三十三天,用心学习。 在这里记录一些学习的东西和学习的心情,内容主要是一些自己学习整理的小笔记。 一、事件选择模型 二、从结构到类 三、类(声明部分+实现部分) 1.类(声明格式) 四、类的访问控制(类体访问说明符<access specifier>:public、private和保护成员protected) 五、小脑袋,大疑问 上述内容如有侵权,联系即删。 感谢阅读-感谢支持 ...

m0_55732114的博客 175

RandLA-Net Tensorrt 推理 c++

RandLA-Net 实现 Tensorrt 部署.

J。 1109

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

Windows下使用winsock2与完成端口(IOCP)编写高伸缩性的网络服务器

转载地址:http://hi.baidu.com/icexile/blog/item/fe4a224cf41dbcf0d72afcaa.html 近期初学winsock2……,编写了一个小小的使用IOCP的服务器测试程序。总结了一下程序的重点部分: 为何使用IOCP: 1、传统的socket服务程序流程是这样: 创建侦听socket -> 绑定socket和IP、端口号 -> list

yi7900的专栏 1347

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

IOCP 进阶

<br />本文章假设你已经理解WindowsNT的I/O模型以及I/O完成端口(IOCP),并且比较熟悉将要用到的API,如果你打算学习IOCP,请参考 Jeffery Richter的Advanced Windows(第三版),第15章I/O设备,里面有极好的关于完成端口的讨论以及对即将使用API的说明。XEIM 飞鸽传书:http://www.freeeim.com/ ,基于IOCP的开源即时通讯系统。

markman101---神即是道 道法自然 如来 1087

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

理解I/O Completion Port

欢迎阅读此篇IOCP教程。我将先给出IOCP的定义然后给出它的实现方法,最后剖析一个Echo程序来为您拨开IOCP的谜云,除去你心中对IOCP的烦恼。OK,但我不能保证你明白IOCP的一切,但我会尽我最大的努力。以下是我会在这篇文章中提到的相关技术:I/O端口同步/异步堵塞/非堵塞服务端/客户端多线程程序设计Winsock API 2.0在这之前,我曾经开发过一个项目,其中一块需要网络支持,当

Stiwin Lee's Favorite 2551

【IOCP】 IOCP模型属于一种通讯模型- 较难

http://baike.baidu.com/link?url=e9vXkKd2aHp8VDr1XTURdwQB4K85r28IYjeMwRIyuaXtsrCsXHY1eohiFgsDXRYRlj6xEQoZFzH9dgKwla2n3q IOCP(I/O Completion Port),常称I/O完成端口。 IOCP模型属于一种通讯模型,适用于(能控制并发执行...

weixin_30695195的博客 133

windows IOCP取消绑定Socket

mysocket正在连接中, 我们又要在mysocket通信中把它从IOCP分离出来。如果我们使用closesocket(mysocket),明显不符合我们的需求。1. 默认情况下我们创建一个mysocket, 然后用CreateIoCompletionPort函数把mysocket和IOCP完成端口绑定在一起。很明显第3步被动技能,靠closesocket(mysocket)的释放原因,IOCP才会取消mysocket的绑定。虽然网络有大神分享过这个方法,但也只是随便性略过,并没有给出完整性代码。

MicrLeo的博客 400
上一篇: I/O完成端口模型
下一篇: Winsock工作模型
Pregunta
博客等级 码龄23年 6粉丝 19原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值