windows 完成端口
在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 完成端口相关推荐
- windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况...
windows下查询端口占用情况 ,强制结束端口占用程序 查询8080端口被那个程序占用 如何强制结束windows下端口占用情况? 下面操作在win10下 在控制台执行命令 1.列出所有端口的情 ...
- VMware中ubuntu虚拟机与windows的端口映射,共享一个IP地址
在ubuntu虚拟机中,运行了meteor的后台程序,需要终端进行连接,需要进行ubuntu虚拟机与windows的端口映射(虚拟机与主机共享IP地址). 下面为设置步骤: 1.点击编译,虚拟网络编辑 ...
- Nginx For Windows Socket 端口转发
Nginx For Windows Socket 端口转发 一.需求说明 二.配置文件 一.需求说明 使用Nginx进行端口转发 Socket 端口通信. 监控本地服务器的 3001 端口,转发到 1 ...
- windows常见端口和协议--SMB(445)-NETBIOS(137-138-139)
Windows常见端口 Windows一般开放udp_137, udp_138, tcp_139, tcp_445端口. 服务 端口 描述 NetBIOS名称服务(NBNS) UDP 137 NBNS ...
- windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况
windows查看端口占用 windows端口占用 查找端口占用程序 强制结束端口占用 查看某个端口被占用的解决方法 如何查看Windows下端口占用情况 参考文章: (1)windows查看端口占用 ...
- 从入门到入土:基于Python|ACK|FIN|Null|Xmas|windows|扫描|端口扫描|scapy库编写|icmp协议探测主机|对开放端口和非开放端口完成半连接扫描|全连接扫描|
此博客仅用于记录个人学习进度,学识浅薄,若有错误观点欢迎评论区指出.欢迎各位前来交流.(部分材料来源网络,若有侵权,立即删除) 本人博客所有文章纯属学习之用,不涉及商业利益.不合适引用,自当删除! 若 ...
- [转] Windows完成端口与Linux epoll技术简介
Windows完成端口与Linux epoll技术简介 2008-01-03 16:18 WINDOWS完成端口编程1.基本概念 2.WINDOWS完成端口的特点 3.完成端口(Completion ...
- Windows禁用端口(445端口为例)
Windows禁用端口(445端口为例) Win+R 输入gpedit.msc 回车进入本地组策略编辑器 计算机配置–>Windows设置–>安全设置–>IP安全策略–>创建I ...
- Windows解决端口占用问题 Port xxxx was already in use
第一次写博客,将自己在开发中遇到最多次的问题记录下,以便于自己日后遗忘查询. "Windows解决端口占用问题" 1.使用windows+R组合键,弹出命令行窗口,输入cmd,回车 ...
- windows tcp端口映射或端口转发
windows tcp端口映射或端口转发 windows内部有一个叫netsh的玩意,可以把tcp端口进行映射或转发,可惜不支持udp. 举个例子: 一台windows有一个80端口,对外可以访问. ...
最新文章
- torch量化的流程
- 18年第十三届黑龙江省赛
- python 递归 分叉_浅谈Python 递归算法指归
- 一个很全的中断资料网站
- SharePoint 2010 各个常用级别对象的获取
- UNITY2018 真机开启deepprofiling的操作
- linux新手入门必看
- 向oracle表空间添加一个数据文件命令
- Linux操作系统监视NVIDIA的GPU使用情况
- 几个常用的python脚本_几个很实用的python脚本
- VC++ (二)类的访问级别
- Semaphore使用,占桌把戏
- 修正win10部署JDK8(使用JDK文件夹中的自带JRE)
- Objective-C中 copy, tetain, assign , readonly , readwrite, nonatomic区别
- 服务器显示404什么意思,404是什么意思?
- 不如意的人生,才是真实的。
- pgm图像修改java_PGM图片格式与代码
- Thinkpad笔记本键盘拆卸
- 宾客往来络绎不绝 企业访客管理如何不失礼仪
- 计算机顶级会议Rankings