在windows网络编程中,有一种完成端口iocp机制,用于处理客户端的连接,避免每当客户端进行连接就创建一
个线程,这样会导致服务器成千上万个线程,而完成端口很好的解决了这个问题。
      自己的理解是:完成端口就是一个IO完成队列,在把服务socket和客户连接socket与这个完成端口绑定,客户端与这个服务socket发生的所有操作,都通过这个完成端口的消息来进行通知,所以里面包含了IO完成的消息通知,在工作线程里面通过对这些消息类型的判断,然后作出相应的处理。
      使用完成端口,还可以使用并发线程(同时工作的线程,与线程切换不一样,这与cpu的数量有关系),这样会   使性能更加高效.

下面讲解完成端口的实现方式和工作机制:

完成端口主要有三个函数实现:

1.  这个函数有两个功能,创建一个完成端口,完成套接口与完成端口的绑定。

         HANDLE WINAPI CreateIoCompletionPort(__in     HANDLE FileHandle, //套接口,需要进行重叠io的句柄,就是服务socket__in_opt HANDLE ExistingCompletionPort,   //指向完成端口的句柄,iocp句柄__in     ULONG_PTR CompletionKey,  //套接口数据__in     DWORD NumberOfConcurrentThreads  //同时工作的线程,设置0为默认);

注:1.  如果是创建一个完成端口,前面三个参数设置成INVALID_HANDLE_VALUE, NULL,0就可以了。如果函

数执行成功,将返回完成端口IOCP句柄。

2.  如果是绑定一个套接口,可以在GetQueuedCompletionStatus(下面会讲这个函数),得到CompletionKey

这个参数。

3.  在绑定前,应该先调用WSAIoctl这个函数设置服务器套接字的工作模式。

4.  如果设置了同时工作线程数n,就启动n个工作线程。

2.   查看完成端口队列里面的消息通知,如果没有,就阻塞,如果有,就更具返回的一些状态作出相应的操

作。这个函数一般都工作在每个工作线程里面。GetQueuedCompletionStatus。

3.  第三个参数主要是用来与工作线程进行通信,主要是用来投递io消息,投递的参数可以在第二个函数里面得

到,然后作出判断,或者退出操作,PostQueuedCompletionStatus。

注意:本来这篇文章写好了的,但是没保存上,气死我了,没有办法又重新写,然自己又懒得不行,所以很多

解释得就不详细了,很多地方也写得很简略,囫囵吞枣吧。

补充: 完成端口的使用就是在异步io的情况下使用的,避免多线程带来的开销,因为开启的
线程越多, 必然会 导致效率的下降。而完成端口把对应所有socket的操作都放在一个线程
里面(具体开多少 个并发线程,要看cp u的数量,一般是cpu的数量的两倍再加2),通过
在这个线程里面,使用完成端 口的函数来获取状态后,再进 行相应的操作,这样可以有
效地减少线程数量,达到了性能的最大话, 不过是在windows使用,linux怎么使用 还不

清楚。

windows 完成端口相关推荐

  1. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况...

    windows下查询端口占用情况 ,强制结束端口占用程序 查询8080端口被那个程序占用 如何强制结束windows下端口占用情况? 下面操作在win10下 在控制台执行命令   1.列出所有端口的情 ...

  2. VMware中ubuntu虚拟机与windows的端口映射,共享一个IP地址

    在ubuntu虚拟机中,运行了meteor的后台程序,需要终端进行连接,需要进行ubuntu虚拟机与windows的端口映射(虚拟机与主机共享IP地址). 下面为设置步骤: 1.点击编译,虚拟网络编辑 ...

  3. Nginx For Windows Socket 端口转发

    Nginx For Windows Socket 端口转发 一.需求说明 二.配置文件 一.需求说明 使用Nginx进行端口转发 Socket 端口通信. 监控本地服务器的 3001 端口,转发到 1 ...

  4. windows常见端口和协议--SMB(445)-NETBIOS(137-138-139)

    Windows常见端口 Windows一般开放udp_137, udp_138, tcp_139, tcp_445端口. 服务 端口 描述 NetBIOS名称服务(NBNS) UDP 137 NBNS ...

  5. windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况

    windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况 参考文章: (1)windows查看端口占用 ...

  6. 从入门到入土:基于Python|ACK|FIN|Null|Xmas|windows|扫描|端口扫描|scapy库编写|icmp协议探测主机|对开放端口和非开放端口完成半连接扫描|全连接扫描|

    此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...

  7. [转] Windows完成端口与Linux epoll技术简介

    Windows完成端口与Linux epoll技术简介 2008-01-03 16:18 WINDOWS完成端口编程1.基本概念 2.WINDOWS完成端口的特点 3.完成端口(Completion ...

  8. Windows禁用端口(445端口为例)

    Windows禁用端口(445端口为例) Win+R 输入gpedit.msc 回车进入本地组策略编辑器 计算机配置–>Windows设置–>安全设置–>IP安全策略–>创建I ...

  9. Windows解决端口占用问题 Port xxxx was already in use

    第一次写博客,将自己在开发中遇到最多次的问题记录下,以便于自己日后遗忘查询. "Windows解决端口占用问题" 1.使用windows+R组合键,弹出命令行窗口,输入cmd,回车 ...

  10. windows tcp端口映射或端口转发

    windows tcp端口映射或端口转发 windows内部有一个叫netsh的玩意,可以把tcp端口进行映射或转发,可惜不支持udp. 举个例子: 一台windows有一个80端口,对外可以访问. ...

最新文章

  1. torch量化的流程
  2. 18年第十三届黑龙江省赛
  3. python 递归 分叉_浅谈Python 递归算法指归
  4. 一个很全的中断资料网站
  5. SharePoint 2010 各个常用级别对象的获取
  6. UNITY2018 真机开启deepprofiling的操作
  7. linux新手入门必看
  8. 向oracle表空间添加一个数据文件命令
  9. Linux操作系统监视NVIDIA的GPU使用情况
  10. 几个常用的python脚本_几个很实用的python脚本
  11. VC++ (二)类的访问级别
  12. Semaphore使用,占桌把戏
  13. 修正win10部署JDK8(使用JDK文件夹中的自带JRE)
  14. Objective-C中 copy, tetain, assign , readonly , readwrite, nonatomic区别
  15. 服务器显示404什么意思,404是什么意思?
  16. 不如意的人生,才是真实的。
  17. pgm图像修改java_PGM图片格式与代码
  18. Thinkpad笔记本键盘拆卸
  19. 宾客往来络绎不绝 企业访客管理如何不失礼仪
  20. 计算机顶级会议Rankings

热门文章

  1. SQLyog设置唯一
  2. Java 设计模式(十三):代理模式
  3. 微信小程序wxparse特殊解析空格,解析↵换行符号
  4. 样本方差与总体方差的区别
  5. X书x-mini-sig_x-mini-mua
  6. 内网建站 NAT穿透 局域网穿透
  7. 搭建 vue项目(Windows + 命令行 + vsCode)
  8. 项目时间管理-知识领域
  9. 数据平台开发是做什么的?需要具备哪些能力
  10. fstream ,ifstream,ofstream的用法详解