IOCP(IO完成端口)是一种伸缩性的IO模型,广泛应用于各种类型的高性能服务器,如Apache等。 IO完成端口,应用程序使用线程池处理异步IO请求的一种机制。...最初设计: 应用程序发出一些异步IO请求,设备驱动把这些工作项目排序到完成端口,在完成端口上等待线程池便可以处理这些完成IO。...1 创建完成端口对象 调用CreateIoCompletionPort函数创建一个完成端口对象,winsock使用这个对象为任意数量的套接字句柄管理...); 2 IO服务器线程和完成端口 关联套接字之前,创建一个或者多个工作线程,在完成端口上执行并处理投递到完成端口上的...IO操作完成后,系统向完成端口对象发送一个完成通知封包。
处于这个思想,WinSock提供了一个新的模型——完成端口模型。 完成端口简介 完成端口本质上是一个线程池的模型,它需要我们创建对应的线程放在那,当完成通知到来时,他会直接执行线程。...在文件中我们也提到过完成端口,其实我们利用Linux上一切皆文件的思想来考虑这个问题就可以很方便的理解,既然我们需要异步的方式来读写网卡的信息,这与读写文件的方式类似,既然文件中存在完成端口模型,网络上存在也就不足为奇了...对于完成端口Windows没有引入新的API函数,而是仍然采用文件中一堆相关的函数。...如果是要将文件句柄与完成端口绑定,这个参数必须穿入一个支持完成端口的文件句柄。在Winsock中如果要绑定SOCKET到完成端口只需要将SOCKET强转为HANDLE。...第二个参数是一个已知的完成端口句柄,如果是创建完成端口,这个参数填入NULL。 第三个参数是一个LONG型的指针,它作为一个标志,由完成通知传入完成线程中,用来标识不同的完成通知。
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) 1 不知道你是否记得前面中说过每消耗一个预先准备客户端的...获取对端和本端的ip地址和端口号,即AcceptEx的 第三个参数lpOutputBuffer中拿(这一步,不是必须) 2....比如可以在新连接接收成功之后,立即准备给对端发数据;或者在收到对端数据的时候准备给对端发数据;在发送数据完成后准备收对端数据。...//调用WSARecv准备收取数据工作(这一步,不是必须) } } } 由于公众号文章字数有限,您可以接着阅读下一篇:《windows完成端口...(三)》 系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六)
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) 1 现在还剩下最后一个问题...我们小结一下,掌握完成端口的关键在于理解以下几点: 完成端口绑定了某个socket后,不仅其事件的读写检测由操作系统完成,而且就算是接受新连接、收发数据的动作也是由操作系统代劳了,操作系统完成后会通知你...初始化准备好的各种缓冲区如何在工作线程里面引用到的关键就在于绑定完成端口时CompletionKey和准备收发缓冲区时OVERLAPPED结构体的使用, CompletionKey对应PER Socket...由于公众号文章字数有限,您可以接着阅读下一篇:《windows完成端口(四)》 系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口...(四) windows完成端口(五) windows完成端口(六)
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) 下面给出上文中使用到的对完成端口模型封装的类的全部代码...====================== Purpose: * 这个类CIOCPModel是本代码的核心类, 用于说明WinSock服务器端编程模型中的 完成端口...* 其中的PER_IO_DATA结构体 是封装了用于每一个重叠操作的参数 PER_HANDLE_DATA是封装了用于每一个Socket的参数, 也就是用于每一个完成端口的参数...* 详细的文档说明请参考 http://blog.csdn.net/PiggyXP Notes: * 具体讲明了服务器端建立完成端口、建立工作者线程、 投递Recv...(五)》 系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六)
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) // 最后释放掉所有资源...====================================================================== // // 投递完成端口请求...bool CIOCPModel::_AssociateWithIOCP( PER_SOCKET_CONTEXT *pContext ) { // 将用于和客户端通信的SOCKET绑定到完成端口中...参考链接:http://blog.csdn.net/piggyxp/article/details/6922277 系列目录 windows完成端口(一) windows完成端口(二) windows完成端口...(三) windows完成端口(四) windows完成端口(五) windows完成端口(六)
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) #include...//////////////////////////////////////////////////// // 工作者线程: 为IOCP请求服务的工作者线程 // 也就是每当完成端口上出现了完成数据包...->m_Socket ); return false; } else { TRACE(_T("Listen Socket绑定完成端口...} //////////////////////////////////////////////////////////// 由于公众号文章字数有限,您可以接着阅读下一篇:《windows完成端口...(六)》 系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六)
系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六) 本人很多年前接触完成端口以来...这篇文章将从为什么这么做的角度来解释完成端口的一些重难点。...使用完成端口一般按以下步骤(这里以网络服务器接受客户端连接并与客户端进行网络通信为例): //步骤1:创建完成端口 //步骤2:创建侦听socket并将侦听socket绑定到完成端口上 //...有,这就是windows的完成端口模型。...(二)》 系列目录 windows完成端口(一) windows完成端口(二) windows完成端口(三) windows完成端口(四) windows完成端口(五) windows完成端口(六)
先说IOCP,其实思路很清晰: 1.声明一个数据结构,用来存放客户套接字和客户信息 2.声明一个包含OVERLAPPED字段的I/O结构 3.创建完成端口...4.创建服务线程 5.接收客户端连接请求 6.关联这个套接字到完成端口中 7.服务线程中不断的等待I/O结果,在结果中提供服务和根据需要发起另一个异步操作...1.创建一个监听套接字 2.将监听套接字关联到完成端口中 3.对监听套接字调用bind()、listen() 4.通过WSAIoctl获取AcceptEx...}COMPLETION_KEY, *LP_COMPLETION_KEY; /// //完成端口句柄 HANDLE g_hComPort = NULL; BOOL g_bRun = FALSE; BOOL...= WSASocket( AF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_OVERLAPPED ); g_sListen = sListen; //将监听套接字与完成端口绑定
TempArray+TempCurr,SorucePacket+TempLen,SPLen-TempLen); TempCurr:=TempCurr+SPLen-TempLen; //已经将数据拷贝完成
一个I/O完成端口关联一个打开文件的实例使应用程序可以收到包括这个文件异步I/O操作的完成通知。...ExistingCompletionPort 完成端口句柄 如果指定一个已经存在的完成端口,函数将关联FileHandle 指定的文件,并返回已存在的完成端口句柄,函数不会创建一个新的完成端口。...如果这个参数为NULL,函数创建一个与FileHandle指定的文 件关联的完成端口,并返回一个新的完成端口句柄。 CompletionKey 单文件句柄,包含指定文件每次IO完成包数据信息。...当 你执行一个已经关联一个完成端口的文件I/O操作,I/O系统将会在这个I/O操作完成的时候向I/O完成端口发送一个完成通知包,I/O完成端口将以先 进先出的方式放置这个I/O完成通知包,并使用GetQueuedCompletionStatus...虽然允许任何数量的 线程来调用GetQueuedCompletionStatus 等待一个I/O完成端口,但每个线程只能同时间内关联一个I/O完成端口,且此端口是线程最后检查的那个端口。
这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口的用法...完成端口的优点 2. 完成端口程序的运行演示 3. 完成端口的相关概念 4. 完成端口的基本流程 5. 完成端口的使用详解 6. 实际应用中应该要注意的地方 一....对于重叠结构的内部细节我这里就不过多的解释了,就把它当成和其他内核对象一样,不需要深究其实现机制,只要会使用就可以了,想要了解更多重叠结构内部的朋友,请去翻阅Jeffrey Richter的《Windows via C/C+...熟悉或者不熟悉多线程编程的朋友,都应该知道,如果在线程睡眠的时候,简单粗暴的就把线程关闭掉的话,那是会一个很可怕的事情,因为很多线程体内很多资源都来不及释放掉,无论是这些资源最后是否会被操作系统回收,我们作为一个C+...,这都是作为一个合格的C++程序员的基本功,在这里就不多说了,如果还是有不太清楚的朋友,请参考我的示例代码中的 StopListen() 和DeInitialize() 函数。
获取对端和本端的ip地址和端口号,即AcceptEx的 第三个参数lpOutputBuffer中拿(这一步,不是必须) 2....比如可以在新连接接收成功之后,立即准备给对端发数据;或者在收到对端数据的时候准备给对端发数据;在发送数据完成后准备收对端数据。...获取对端和本端的ip地址和端口号, 即AcceptEx的第三个参数lpOutputBuffer中拿(这一步,不是必须) 2.
系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)的一些理解(三) 关于windows完成端口...(IOCP)的一些理解(四) 关于windows完成端口(IOCP)的一些理解(五) 关于windows完成端口(IOCP)的一些理解(六) 本人很多年前接触完成端口以来,期间学习和练习了很多次,本以为自己真正地理解了其原理...使用完成端口一般按以下步骤(这里以网络服务器接受客户端连接并与客户端进行网络通信为例): //步骤1:创建完成端口 //步骤2:创建侦听socket并将侦听socket绑定到完成端口上 //...有,这就是windows的完成端口模型。...(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)的一些理解(三) 关于windows完成端口(IOCP)的一些理解(四) 关于
系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)的一些理解(三) 关于windows完成端口...(IOCP)的一些理解(四) 关于windows完成端口(IOCP)的一些理解(五) 关于windows完成端口(IOCP)的一些理解(六) #include "StdAfx.h" #include...//////////////////////////////////////////////////// // 工作者线程: 为IOCP请求服务的工作者线程 // 也就是每当完成端口上出现了完成数据包...(IOCP)的一些理解(六)》 系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)的一些理解...(三) 关于windows完成端口(IOCP)的一些理解(四) 关于windows完成端口(IOCP)的一些理解(五) 关于windows完成端口(IOCP)的一些理解(六)
系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP)的一些理解(二) 关于windows完成端口(IOCP)的一些理解(三) 关于windows完成端口...我们小结一下,掌握完成端口的关键在于理解以下几点: 完成端口绑定了某个socket后,不仅其事件的读写检测由操作系统完成,而且就算是接受新连接、收发数据的动作也是由操作系统代劳了,操作系统完成后会通知你...由于公众号文章字数有限,您可以接着阅读下一篇:《关于windows完成端口(IOCP)的一些理解(四)》 系列目录 关于windows完成端口(IOCP)的一些理解(一) 关于windows完成端口(IOCP...)的一些理解(二) 关于windows完成端口(IOCP)的一些理解(三) 关于windows完成端口(IOCP)的一些理解(四) 关于windows完成端口(IOCP)的一些理解(五) 关于windows...完成端口(IOCP)的一些理解(六)
端口扫描是一种用于识别目标系统上哪些网络端口处于开放、关闭或监听状态的网络活动。在计算机网络中,端口是一个虚拟的通信端点,用于在计算机之间传输数据。每个端口都关联着特定类型的网络服务或应用程序。...Boost.Asio是一个强大的C++库,提供了异步I/O和网络编程的支持。...boost::bind(&AsyncConnect::timer_handle, this, _1, boost::ref(timeout))); do { // 等待异步操作完成...boost::bind(&AsyncConnect::timer_handle, this, _1, boost::ref(timeout))); do { // 等待异步操作完成...} } } else { std::cout << "参数错误" << std::endl; } return 0; } 至此,一个基于ASIO异步模型的,多线程端口扫描器就这么完成了
0-1023是公认端口号,即已经公认定义或为将要公认定义的软件保留的,而1024-65535是并没有公共定义的端口号,用户可以自己定义这些端口的作用。 那么端口号到底有什么作用呢?...上一次提到提到在一个经过OSI第四层传输层封装的数据段的第四层报头里包含两个端口号,既源端口号和目的端口号,目的端口号的作用上面已经介绍了,下面让我们了解一下原端口号吧。...而B收到数据后会读取数据包的源端口号和目的端口号,然后记录下来,当软件创建了要返回的数据后就把原来数据包中的原端口号作为目的端口号,而把自己的端口号作为原端口号,也就是说把收到的数据包中的原和目的反过来...,然后再送回A,A再重复这个过程如此反复直到数据传输完成。...记住mountd可运行于任何端口(到底是哪个端口,需要在端口111做portmap查询),只是Linux默认端口是635,就像NFS通常运行于2049端口。
Boost.Asio 是一个功能强大的 C++ 库,用于异步编程和网络编程,它提供了跨平台的异步 I/O 操作。...端口映射通常用于将一个网络端口上的流量转发到另一个网络端口。这对于实现网络中间人攻击、内网穿透等场景非常有用。...end_read(const boost::system::error_code& error, size_t bytes_transferred):读取操作完成时的回调函数,处理可能的错误,如果没有错误则调用...end_write(const boost::system::error_code& error):写入操作完成时的回调函数,处理可能的错误,如果没有错误则调用 begin_read 启动下一轮异步读取操作...调用 io_service.run() 开始事件循环,等待异步操作的完成。 异常处理: 使用了 try 和 catch 块,捕获任何可能抛出的异常,并在 catch 块中忽略异常。
领取专属 10元无门槛券
手把手带您无忧上云