完成端口在用WSASend发送数据的时候,到底是已经发送完了还是只进入完成端口线程操作? [问题点数:20分,结帖人lyzcom]

Bbs3
本版专家分:988
结帖率 100%
Bbs10
本版专家分:188320
Blank
进士 2006年 总版技术专家分年内排行榜第五
2004年 总版技术专家分年内排行榜第八
Blank
银牌 2006年10月 总版技术专家分月排行榜第二
2006年9月 总版技术专家分月排行榜第二
Blank
铜牌 2006年5月 总版技术专家分月排行榜第三
Blank
微软MVP 2006年1月 荣获微软MVP称号
2008年1月 荣获微软MVP称号
2007年1月 荣获微软MVP称号
Bbs6
本版专家分:9419
Bbs5
本版专家分:2156
关于IOCP乱序的探讨
关于IOCP的探讨      本文主要探讨一下windows平台上的<em>完成端口</em>开发及其与之相关的几个重要的技术概念,这些概念都是与基于IOCP的开发密切相关的,对开发人员来讲,又不得不给予足够重视的几个概念: 1) 基于IOCP实现的服务吞吐量 2)IOCP模式下的<em>线程</em>切换 3)基于IOCP实现的消息的乱序问题。 一、IOCP简介     提到IOCP,大家都非常熟悉,其基本
IOCP应用中,有关内存释放的几个需要注意的地方
写文章最主要目的是备忘,以免一些好不容易想通的问题,被人体新陈代谢给清理出大脑,最后忘得一干二净,要是平常没个记录的好习惯会很心累。 只不过再充分的准备,再自信满满,再运筹帷幄,也敌不过世事无常。 昨天,我严格按照卸载的标准流程删除软件,没想到竟然把我D:\tools文件夹给整个端掉了,以前的记录文档,全没了。 更苦的是,我并没有立即发现,而是又往D盘装了若干东西之后
socket通信之八:完成端口模型实现的客户/服务器模型
<em>完成端口</em>的详细说明可以参考下面这两篇文章,理论讲的很好。 手把手教你玩转SOCKET模型:<em>完成端口</em>(Completion Port)详解  <em>完成端口</em>(I/O completion)原理 收藏 但是本文的实现和它们<em>还是</em>有点区别。 这里就只列出<em>完成端口</em>服务器端的基本流程了。 首先,说说主<em>线程</em>: 1.创建<em>完成端口</em>对象 2.创建工作者<em>线程</em>(这里工作者<em>线程</em>的
一个简单的IOCP(IO完成端口)服务器/客户端类
作者:Amin Gholiha   翻译:高庆余 文章来源:[url]http://www.codeproject.com/KB/IP/iocp_server_client.aspx[/url]   前言:源代码使用比较高级的IOCP技术,它能够有效的为多个客户端服务,利用IOCP编程API,它也提供了一些实际问题的解决办法,并且提供了一个简单的带回复的文件传输的客户端/服务器。   1
用C++实现HTTP服务器 - 处理完成端口模型(IOCP)的超时问题
如何处理<em>完成端口</em>模型(IOCP)的超时问题. 作者: 阙荣文  2011/7/12 前言 <em>完成端口</em>(IOCP)是所有Windows I/O模型中最复杂,也是性能最好的一种.在关于IOCP的编程中,难点之一就是超时控制. 以下以HTTP服务器程序为例说一说. 其实超时控制也不是很难,问题是Windows的IOCP模型本身并没有提供关于超时的支持(也行以后的版本会有?),所以一切
在 windows IOCP 中,如何等待异步 IO 操作完成(包括被取消)[转]
在 windows IOCP 中,如何等待异步 IO <em>操作</em>完成(包括被取消)[转] 关于 IOCP 中如何安全释放资源,我想关键点是在于如何等待异步 IO 完成,被取消也暂且认为是一种完成。 在使用多<em>线程</em>来运行 IOCP 的 GQCS 函数的<em>时候</em>,当某个一个<em>线程</em>(<em>线程</em>A)执行了 closesocket 之后,将引发在这个 socket 发出的所有异步 IO 被取消。 这些被取消的 IO 仍然会被 GQCS 取得并返回,并且通常这是在另外一个<em>线程</em>中(<em>线程</em>B)。 
关于windows完成端口(IOCP)的一些理解
       本人很多年前接触<em>完成端口</em>以来,期间学习和练习了很多次,本以为自己真正地理解了其原理,最近在看网狐的服务器端源码时又再一次拾起<em>完成端口</em>的知识,结果发现以前理解的其实很多偏差,有些理解的甚至都是错误的。网络上关于windows<em>完成端口</em>的介绍举不胜举,但大多数都是介绍怎么做,而不是为告诉读者为什么这么做。看了很多遍小猪的讲解:http://blog.csdn.net/piggyxp/art...
IOCP 使用WSASend群发消息
http://download.csdn.net/my/uploads 稍加改动
Libevent源码分析(七)--- IOCP
IOCP模型 关于iocp模型,网上有很多资料,这里不详细分析,下面这篇文章写的就非常详细: <em>完成端口</em>(CompletionPort)详解 - 手把手教你玩转网络编程系列之三
完成端口IOCP模型判断客户端是否已关闭连接(掉线)
判断客户端是否关闭: 1 GetQueuedCompletionStatus 返回 FALSE,根据错误号判断。 2 客户端端定时<em>发送</em>(也就是心跳包判断) 补:GetQueuedCompletionStatus 的返回值为 ERROR_SUCCESS 和lpNumberOfBytes 为0的时,客户端sockt关闭。在测试的<em>时候</em>,连接的客户端发生异常崩溃,强制关闭客户端后,Ge
一个简单的IOCP(IO完成端口)服务器/客户端类(中文版)
一个简单的IOCP(IO<em>完成端口</em>)服务器/客户端类 ——A simple IOCP Server/Client Class By spinoza 原文【选自CodeProject】 http://www.codeproject.com/Articles/10330/A-simple-IOCP-Server-Client-Class 源代码: http://www.codeproject
使用AcceptEx方法的完成端口
#include #include #include #include //微软扩展的类库 using namespace std; #define SEND 0 #define RECV 1 #define ACCEPT 2 #define DATA_LENGTH 1000 //单句柄数据定义 typedef struct _PER_HANDLE_DATA
IOCP服务器收发、处理数据包的简单框架
这是windows上实现的IOCP接收、处理和<em><em>发送</em>数据</em>包的一个简单通用的框架,新建一个空项目,全部文件导入进去编译即可(需要win7及以上系统);程序比较简洁,很好理解,希望对初学者有一定的帮助。
Socket向完成端口多次发送消息浅见
1.     同时<em>发送</em>多个WSARecv消息处理,多余的会有什么情况?使用代码测试,显示结果为全部返回错误997,表示都可以正常发出recv<em>操作</em>,且多个工作<em>线程</em>同时在检测此socket的多个recv消息,运行片刻立即关闭Client端,发现工作<em>线程</em>出现的异常,1个或2个工作<em>线程</em>中的closesocket函数调用失败,错误码为10038,因此要尽力避免对同一个socket向<em>完成端口</em><em>发送</em>重复的同一
IOCP之WSASend,0字节探测发送。工作线程真正发送
IOCP_WSASend函数是多<em>线程</em>消息包<em>发送</em>函数,这里会进行加锁拷贝数据到缓冲区,然后检测当前是否正在<em>发送</em>过程中。如果没有正在异步<em>发送</em>,那么投递0字节<em>发送</em>。 #define OVL_RECEIVE 0X01 #define OVL_SEND0 0X02 #define OVL_CLOSE 0X03 #define OVL_SENDE 0X04 // 缓冲区安全锁 ...
win32命名管道/完成端口用法练习
所谓<em>完成端口</em>,就是当事件触发时,io端口<em>操作</em>已完成。 此时完成的是上次执行过的<em>操作</em>,一般是readfile/writefile/waitforconnect。 所以一般的流程是: 添加等待事件->连接成功,readfile(相当于注册回调)。 写动作单独处理。
完成端口之客户端篇
本实例程序实现了用<em>完成端口</em>管理客户端的连接,让客户端程序出来网络数据更加高效,支持多<em>线程</em>和多并发连接,用户只需派生自己的子类即可享用<em>完成端口</em>的强大功能了···
IO完成端口的使用
IO<em>完成端口</em>的使用一,样例介绍 一,样例介绍 生产者-消费者模式是一种非常常见的设计模式,它可以很好地模拟实际编程中的大部分使用场景,而IO<em>完成端口</em>也是用来实现多<em>线程</em>之间的通信,因此,本实例基于该模式完成。 首先,我们需要创建IO<em>完成端口</em>,最后一个参数为0,默认创建的IO<em>完成端口</em>数目就是处理器数目,同时,和要创建一定数目的消费者<em>线程</em>,来处理数据。 //创建1个IO<em>完成端口</em>(最后一个参数为0表示创建...
完成IO使用总结IOCP
完成IO使用总结   IOCP(I/O Completion Port,I/O<em>完成端口</em>)是性能最好的一种I/O模型。它是应用程序使用<em>线程</em>池处理异步I/O请求的一种机制。在处理多个并发的异步I/O请求时,以往的模型都是在接收请求是创建一个<em>线程</em>来应答请求。这样就有很多的<em>线程</em>并行地运行在系统中。而这些<em>线程</em>都是可运行的,Windows内核花费大量的时间在进行<em>线程</em>的上下文切换,并没有多少时间花在<em>线程</em>运行
完成端口学习笔记(一):完成端口+控制台 实现文件拷贝
最近在整理手里一个项目的后台服务端归档程序,重新梳理了一下有关“<em>完成端口</em>”的知识,发现<em>还是</em>有很多模棱两可的地方,下面记录一下再次学习的点滴,博文中以一个简单的控制台文件拷贝程序来演示了“<em>完成端口</em>”的内部机制和使用方法,该篇博文还会有后续的补充章节,不知道什么时间会再补充^_^。
IOCP完成端口出现10054错误,服务端假死的问题
http://bbs.csdn.net/topics/390423915
socket通信之九:使用完成端口实现的一个聊天室
基本上windows平台下的几种IO模型都实现了一遍,还有两个没有实现,但是它们一个需要基于windows消息,一个和重叠IO中的事件通知模型比较类似,并且不能实现真正的异步,所以就不列出来了。 这一篇介绍如何实现一个聊天室。前面介绍的几种模型中除了基本的socket模型和阻塞版本的模型之外都可以用来实现聊天室,因为这两个模型还不能实现支持多个客户端。对于其它的几个模型,我们需要做的只是
关于WSARecv在IOCP使用中程序崩溃的问题
最近使用IOCP在搞一个服务器端程序,发现在release编出来的版本运行的<em>时候</em>,由于接收数据过快,出现程序崩溃,尽管release生成调试信息,但堆栈处于不可调试的状态。而debug情况下不出现这种情况。后来在网上,找了两天,试了两天。终于找到方法。     原因是:WSARecv中的Overlap参数不能设置成局部变量,而由于我是在一个函数中定义了一个Overlap局部变量,当WSARecv
IOCP完成端口资料整理——"高大上",够全,够详细
最经典: By PiggyXP(小猪)<em>完成端口</em>(CompletionPort)详解 http://blog.csdn.net/han_jiang_xue/article/details/17960827   一个简单的IOCP(IO<em>完成端口</em>)服务器/客户端类 (中文版)http://blog.csdn.net/han_jiang_xue/article/details/18269203
DELPHI高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
例子主要包括IOCP控件封装、服务端实现、传输协议和日志、控制、SQL查询、上传、下载等协议实现,并包括一些初步的性能测试结果。 服务端: 界面截图如下: 提供服务和桌面方式运行,桌面方式可直接打开程序,方便日常调试,可以使用命令行注册或卸载服务,在CMD中输入D:\DEMO\IOCPDemo\Bin\IOCPDemoSvr.exe -install来注册服务,在CMD输入D:\DE
求助 完成端口IOCP 编程中 内存上升 问题
最近在项目中使用了IOCP<em>完成端口</em>来实现TCP服务端,发现运行过程中内存持续上升。 实际测试中我只连了一个客户端,每秒发一次数据,大约30左右字符。 请求CSDN高手指点: 代码从网上找的,感觉比较经典,就用了: 附件是IOCP源码,对IOCP的使用介绍的比较好,数据结构设计的比较巧妙,我反复看过也没发现内存泄漏的地方, VS编译器调试结束也没发现memory leak提示. 备注:客...
Java与完成端口IOCP
文章来源:http://xiaohuabiao.blog.163.com/blog/static/13848218201010262717738/
完成端口读取文件
<em>完成端口</em>首先得了解什么是重叠io OVERLAPPED I/O 异步APC 下面的例子只告诉你怎么写这个程序, 不是告诉你理论,即如果在服务器上为什么不使用一个<em>线程</em>一个客户的模型 CreateIoCompletionPort  创建一个<em>完成端口</em>. 这个函数有一般需要调用2次      第一次:HANDLE iocp = CreateIoCompletionPort(INVALID_HANDL...
完成端口通信例子
 代码贴上来以后慢慢修改 服务端代码: #include #define BUFFER_SIZE 1024 #define OP_READ 18 #define OP_WRITE 28 #define OP_ACCEPT 38 #define CHECK_CODE 0x010110 BOOL bStopThread = false; typedef struct _P
Win socket编程--IOCP完成端口模型
一、为什么选用<em>完成端口</em> 网络通信方式大致有以下几种: 同步方式:所有<em>操作</em>在一个<em>线程</em>内顺序执行,则通信<em>操作</em>会阻塞同一<em>线程</em>其他<em>操作</em>。同步+多<em>线程</em>方式:服务器端为每一个连入的客户端建立一个<em>线程</em>进行通信,但当客户端过多时,建立大量<em>线程</em>占用过多资源,而且CPU需要很多时间进行<em>线程</em>的切换。<em>完成端口</em>:让所有的通信请求排到队列中,利用事先建立的少量几个<em>线程</em>依次处理队列中的请求,因为<em>线程</em>数量少,无需用大
使用IO完成端口IOCP与线程池创建高性能服务器
使用IO<em>完成端口</em>IOCP与<em>线程</em>池创建高性能服务器 在使用socket网络编程,实现一个服务器时,初学者最容易想到方法是当服务器监听的socket接受(accept)到一个客户端时创建一个<em>线程</em>,然后在<em>线程</em>中调用recv函数实时监控客户端是否有数据<em>发送</em>过来。这种方法是可以实现服务器对客户端数据的监听,但是这种方法效率很低,无法支持大量客户端同时连接。这种方法需要对每个连接的客户端创建一个<em>线程</em>,如果有...
C# IOCP完成端口模型(简单实用高效)
1、在C#中,不用去面对<em>完成端口</em>的<em>操作</em>系统内核对象,Microsoft<em>已经</em>为我们提供了SocketAsyncEventArgs类,它封装了IOCP的使用。请参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx?cs-save-lang=1&amp;amp;cs-lang=cpp#cod...
socket编程之完成端口(附一个简单的IOCP例子)
“<em>完成端口</em>”模型是迄今为止最为复杂的—种I/O模型。然而。假若—个应用程序同时需要管理为数众多的套接字,那么采用这种模型。往往可以达到最佳的系统性能,然而不幸的是,该模型只适用于以下<em>操作</em>系统(微软的):Windows NT和Windows 2000<em>操作</em>系统。因其设计的复杂性,只有在你的应用程序需要同时管理数百乃至上千个套接字的<em>时候</em>、而且希望随着系统内安装的CPU数量的增多、应用程序的性能也可以线性
IOCP的线程池管理
一直很迷惑IOCP是怎么管理<em>线程</em>池的.还有就是GetQueuedCompletionStatus函数和<em>线程</em>池是什么关系,是GetQueuedCompletionStatus通过<em>线程</em>池的<em>线程</em>调用完成请求,<em>还是</em>先调用GetQueuedCompletionStatus得到请求在把请求交给<em>线程</em>池的<em>线程</em>完成的呢?当你创建一个了IOCP,并指定了能并发运行的<em>线程</em>数目(CPU*2).当完成的I/O项<em>进入</em>队列
IOCP的一些心得
IOCP的工作<em>线程</em>的个数一般设置为processors *2+2,这是综合考虑了工作<em>线程</em>可能是等待/挂起/正在执行的状态。如果你测试出更好的结果,以你的为标准。IOCP的工作<em>线程</em>由系统调度和优化,不要去干预<em>线程</em>的调度,除非你自信能超越系统的调度。在遇到奇怪的问题时,可以尝试减少IOCP工作<em>线程</em>数量,来定位问题所在。应用层在处理收到的数据时,尽快将数据处理掉或是拷贝一份,避免阻塞IOCP工作<em>线程</em>。在
IOCP-完成端口-改编CSDN小猪例子
http://blog.csdn.net/piggyxp/article/details/6922277#comments这篇文章很好的描述了IOCP并提供了很好的客户端和服务器例子;而我为服务器添加了<em><em>发送</em>数据</em>,采用WSASend函数,然后给客户端加了接收数据,方便测试服务器发来的数据。工程用的vs2010。
c++基于windows下完成例程、完成端口使用
很详尽的一篇windows<em>完成端口</em>网络编程讲解 http://blog.csdn.net/piggyxp/article/details/6922277
c++完成端口使用实例
工程包含server端和client端,server端使用<em>完成端口</em>,可连接n个client端,并接受client<em>发送</em>的数据。
IOCP中的socket错误和资源释放处理方法
原文链接:http://www.cnblogs.com/flying_bat/archive/2007/11/10/955348.html 前言:   错误处理和socket释放, 是IOCP编程中的一大难点. 本文试图就IOCP设计中经常遇到的这个难题展开论述并寻找其解决方案, 事实上, 文中所述的解决方式不仅仅适用于IOCP, 它同样适用于EPOLL等多种服务器编程的网
完成端口详细说明(接受连接请求)
 服务器要做的最普通的事情之一就是接受来自客户端的连接请求。在套接字上使用重叠I/O接受连接的惟一API就是AcceptEx()函数。有趣的是,通常的同步接受函数accept()的返回值是一个新的套接字,而AcceptEx()函数则需要另外一个套接字作为它的参数之一。这是因为AcceptEx()是一个重叠<em>操作</em>,所以你需要事先创建一个套接字(但不要绑定或连接它),并把这个套接字通过参数传给Accep
IOCP在WSARecv出现10054错误以后,ACCEPT假死的问题
之前一直用AcceptEx投递accept消息,但是经过大量测试发现,在WSARecv出现错误以后,在进行大量的连接,服务器就没有任何反应,经过检查,并没有发现死链接。改用单独的<em>线程</em>,使用普通的accept以后,问题得到解决!
完成端口GetQueuedCompletionStatus返回值的问题
 <em>完成端口</em>GetQueuedCompletionStatus返回值的问题先看看GetQueuedCompletionStatus函数的完整声明:BOOL GetQueuedCompletionStatus(  HANDLE CompletionPort,         LPDWORD lpNumberOfBytes,      PULONG_PTR lpCompletionKey,    L
使用IOCP完成端口和SOCKET封装的成熟异步TCP类
使用IOCP<em>完成端口</em>和SOCKET封装的异步TCP类。 支持客户端和服务器的常用TCP接口:绑定Bind、监听Listen、接收Recv、连接Conn、<em>发送</em>Send、关闭Close。所有接口均使用异步回调的方式处理,内部实现使用Windows下性能最高的IOCP<em>完成端口</em>网络模型,并很好地处理了多<em>线程</em>安全和同步问题。 <em>线程</em>创建和事件信号量等地方用到了MFC的类,如果项目不支持MFC,可以把这些地方替换成WindowsAPI的方式。 代码是从成熟项目中分离出来的,能达到很高的性能和网络吞吐量,并且稳定无BUG。
IOCP中10054错误
最近在测试IOCP模型的UDP通讯中发现,如果服务端UDP套接字直接给某个客户端<em><em>发送</em>数据</em>,而该客户端不存在,会导致     上面的GetQueuedCompletionStatus会被激活,但返回错误,数据大小为0,     而且再投递WSARecvFrom请求,即使没有客户端<em><em>发送</em>数据</em>,也会立即收到GetQueuedCompletionStatus     返回的错误消息,最终导致再也无法接收客户
C#高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
例子主要包括SocketAsyncEventArgs通讯封装、服务端实现日志查看、SCOKET列表、上传、下载、远程文件流、吞吐量协议,用于测试SocketAsyncEventArgs的性能和压力,最大连接数支持65535个长连接,最高命令交互速度达到250MB/S(使用的是127.0.0.1的方式,相当于千兆网卡1Gb=125MB/S两倍的吞吐量)。服务端用C#编写,并使用log4net作为日志模块。
一个IOCP 例子
IOCP 例子 翻译人: Kevin Chen.  原文链接:http://www.codeproject.com/KB/IP/iocp_server_client.aspx  1. 简介     2. IOCP 2.1. 异步<em>完成端口</em>(IOCP)简介          一个服务器程序如果不能同时服务多个客户端,则不能称之为服务程序,通常,异步I/O调用和多<em>线程</em>被用来实现同
iocp 关闭
http://blog.csdn.net/simbi/article/details/3738933 http://www.cnblogs.com/BeginGame/archive/2011/09/22/2185164.html 及时监测连接被动关闭        除非有特别要求,否则你应该总是对每个连接保持一个挂起的接收pending io (使用WSARecv投递)。
重叠I/O完成例程模型如何同时投递WSARecv和WSASend
参考自这篇文章: http://www.winsocketdotnetworkprogramming.com/winsock2programming/winsock2advancediomethod5g.html 推荐大家去上面看看,讲得很细致,一步一步都很详细。因为都是英文的,所以坚持吧~下面重点就解释一下其原理,是通过什么方式来使一个完成例程同时处理WSARecv和WSASend的。首先我们
C#高性能大容量SOCKET并发完成端口例子(有C#客户端)完整实例源码
遥望星空 好好干,有前途! 博客园 首页 新随笔 联系 管理 订阅 随笔- 1082  文章- 0  评论- 151  C#高性能大容量SOCKET并发(转) C#高性能大容量SOCKET并发(零):代码结构说明  C#高性能大容量SOCKET并发(一):IOCP<em>完成端口</em>例子介绍 C#高性能大容量SOCKET并发(二):SocketAsyncEventArgs封装 C#高性...
关于TCP/IOCP构架中出现的假死连接解决方案
如果在2台不同的公网机器,对TCP的c/s做过详细的压力测试,那么很不幸,会有很多人发现自己的server端会出现大量的假死连接。 假死连接具体表现如下: 1、在s端机器上,会有一些处于TCP_ESTABLISHED状态的“正常”连接; 2、但是在c端机器上,你的tcp客户端<em>已经</em>提示当前连接<em>已经</em>断开,比如10053/10054。 3、c端此时虽然可以断线重连s端,但是上一次的连接状态依...
IOCP完整例子
本文是我在学习IOCP的<em>时候</em>,第一次写一个完整的例子出来,当然了,参考了CSDN上一些朋友的博客,大部分都是按照他们的思路写的,毕竟我是初学者,参考现成的学起来比较快。当然了,真正用到项目中的IOCP肯定不止这么简单的,还有内存池,环形缓冲区,socket连接池等高端内容,后面我会参考一些例子,写出一个完整的给大家看。 /*************************************
C#高性能大容量SOCKET并发完成端口例子IOCPDemo_NET_V4
C#高性能大容量SOCKET并发<em>完成端口</em>例子IOCPDemo_NET_V4
.net socket与完成端口、异步发送相关研究
原帖地址:http://www.cnsw.org/bbs/thread-68634-1-1.html 经过一番研究,终于可以确认,.net socket的beginSend和beginReceive用的是<em>完成端口</em>。(windows 98上不是,因为98没有这样的机制)。如果微软没有撒谎的话。<em>发送</em>大量数据时,Socket.BeginSend和Socket.Send的速度是有差别的。在局域网里面,这种差别表现不明显。但是在一个高延迟的网络中,差别就很大。<br /
IOCP多次投递
iocp 的话 可以同时进行多次投递 这是没有问题的。 你可以同时投递读和写。 写的话  可以同时投递多个,而且 他会按照你投递的顺序进行发 送 理论上说iocp 如果同时多次投递send 如果某次没有send 完整的话 那就会出现乱序的。但是我在自己的代码里没遇到过,所以你自己考虑一 下。 你可以可以在自己的socket 对象上面加一个<em>发送</em>队列,只进行一次send 投递,在<em>发送</em>成功以后,从队
IOCP的缓冲区
IOCP的缓冲区,WSAENOBUFS错误产生的原因及解决方法
Socket通讯 完成端口 怎么实现同时收发
Socket通讯 <em>完成端口</em> 同时收发 接收 <em>发送</em>
DELPHI高性能大容量SOCKET并发(二):IOCP完成端口控件封装
IOCP<em>完成端口</em>介绍: <em>完成端口</em>模型是Windows平台下SOCKET端口模型最为复杂的一种I/O模型。如果一个应用程序需要同时管理为数众多的套接字,而且希望随着系统内安装的CPU数量的增多,应用程序的性能也可以线性提升,采用<em>完成端口</em>模型,往往可以达到最佳的系统性能。 <em>完成端口</em>可以管理成千上万的连接,长连接传文件可以支持5000个以上,长连接命令交互可以支持20000个以上。这么大并发的连
完成端口模式
<em>完成端口</em>模式        <em>完成端口</em>是到目前为止最为复杂的输入输出模式。然而,当一个应用不得不同时处理大量的socket时,它也提供了使系统性能达到最佳的可能性。不幸的是,<em>完成端口</em>只能用在windows  NT和windows2000上。由于<em>完成端口</em>被设计得极为复杂,它应该成为程序员的青年禁卫军,只有在被迫面对几百甚至几千个并发的socket、你又希望在添加CPU后可
分享一个自己写的IOCP服务器的类源码
工作任务,需要写一个服务端软件,客户端连接数大概有几百台,以后每年以几十台的数量增加,以往的经验都是使用多<em>线程</em>+同步socket网络编程,实现既简单逻辑上又清楚明白,这次写服务端考虑到性能、效率、资源分配等问题肯定是不能这么做了,查了一些资料最终选择IO<em>完成端口</em>这个模型,记得《Windows核心编程》一书中作者曾说过“<em>完成端口</em>恐怕是Windows里最复杂的内核对象”这样的话
完成端口的数据接收问题
DWORD   __stdcall       CompletionRoutine(LPVOID   Param)     {     CompletionPortModel*   pCP   =   (CompletionPortModel*)Param;     DWORD   dwNumberBytes;     PPER_HANDLE_CONTEXT   lpHandleContext  
windows IOCP完成端口原理详解
开篇之前先放上本次讲的IOCP project github地址:https://github.com/GTHubT/GTSever.git 。这个project中包含了IOCP和select,各自封装成一个动态链接库,可以直接使用。同时项目配有完整的glog支持,方便调试,并可以通过config控制server。代码中可能会存在一些未知的bug,欢迎大家提出,正在完善过程中,代码可以优化的地方请
send 和 WSASend性能比较
socket本身有一个send函数,这个函数的只能一次<em>发送</em>一个缓冲区,这对于在<em>发送</em>大量数据的<em>时候</em>或者数据包很多的<em>时候</em>就可能导致可能导致系统的低性能,主要原因在于调用太多次的send函数,导致从用户态到核心态的不断切换,而耗费了当前的CPU时钟周期。 那么解决办法就是减少调用send的次数,一种办法就是使用一个大一点的BUFFER,在<em><em>发送</em>数据</em>的<em>时候</em>将多个数据包的内容COPY到这个BUFFER中
用IOCP实现个简易TCP并发服务器
我们前面接触过几个高效的unix/linux的异步IO模型:select,poll,epoll,kqueue,其实windows也有它的异步模型,比如windows版本的select,当然最高效的还属IOCP吧。我也没有做过多少windows的网络编程,但是看到网上不少人拿IOCP与epoll模型做对比,觉得必定不简单,忍不住试试。IOCP的原理大家多百度百度吧,我也还没弄清楚,呵呵。 大致核心
C++线程池结合IOCP完成端口实现socket高并发服务端程序
C++<em>线程</em>池结合IOCP<em>完成端口</em>实现socket高并发服务端程序 包含mysql数据库<em>操作</em>、json数据解析
高性能大容量SOCKET并发(一):IOCP完成端口例子介绍
例子主要包括IOCP控件封装、服务端实现、传输协议和日志、控制、SQL查询、上传、下载等协议实现,并包括一些初步的性能测试结果。 服务端: 界面截图如下: 提供服务和桌面方式运行,桌面方式可直接打开程序,方便日常调试,可以使用命令行注册或卸载服务,在CMD中输入D:\DEMO\IOCPDemo\Bin\IOCPDemoSvr.exe -install来注册服务,在CMD输入D:\DE
TCP完成端口服务器构建
版权声明:本文为博主原创文章,未经博主允许不得转载。 在vs2008中编译通过,vs2010应该也没有问题。 使用静态MFC dll。 其他配置保持默认即可。 可能需要设置/MTD运行时。 可以实现向指定客户端ip<em>发送</em>信息 (该客户端必须首先连接进服务器) 从指定客户端ip中取出数据。 我使用C++类进行了封装, 对各种异常进行了处理。 进行了较
IO完成端口用于socket通信
 http://blog.csdn.net/u012501459/article/details/48182783
c++使用完成端口实现服务器的高性能并发
如何使用c++,借助<em>完成端口</em>完成大并发服务器的搭建,是今天要讨论的问题,套路如下: 套路总结一下: 创建<em>完成端口</em> 依据CPU核数创建一定数量的<em>线程</em> <em>线程</em>中不断调用GetQueuedCompletionStatus检查<em>完成端口</em>状态,分别给予处理 创建一个socket,绑定IP和端口 将这个socket绑定到第一步创建的<em>完成端口</em>上 获取当前服务器的CPU核数,根据...
Windows网络编程 — UDP完成端口的实现
在Winwos下共有5种I/O模型,可让Winsock应用程序对I/O进行管理,它们包括:   select(选择); WSAAsyncSelect(异步选择模型); WSAEventSelect(事件选择模型); Overlapped(重叠); completion port(<em>完成端口</em>); 以下记叙的是<em>完成端口</em>的实现步骤:(相关函数s参数说明,详见MSDN) 1、使用函数HANDLE CreateIoCompletionPort(...)创建一个<em>完成端口</em>句柄
IOCP 系列函数讲解
CreateIoCompletionPort详解 GetQueuedCompletionStatus PostQueuedCompletionStatus WSASocket Socket与WSASocket的区别 WSAEventSelect WSARecvCreateIoCompletionPort()详解函数原型:HANDLE WINAPI CreateIoCompletionPort(
【Windows网络编程】完成端口IOCP介绍(超详细)
这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中<em>完成端口</em>的方方面面的信息,从API的用法到使用的步骤,从<em>完成端口</em>的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会<em>完成端口</em>的用法,本文附带了有详尽注释的使用MFC编写的图形界面的示例代码。         我的初衷是希望写一份互联网上能找到的最详尽的关于<em>完成端口</em>的教学文档,而且让对Socket编程略有了解的人都能够
完成端口IOCP详解
原文地址:https://www.cnblogs.com/talenth/p/7068392.html 修改自: http://blog.csdn.net/piggyxp/article/details/6922277 ps: 原作者很厉害了, 把一个iocp模型讲解的这么形象,不过在实践过程中发现一些细节说得有问题, 在文中标红指出, 另外删掉了原文中一些我认为有些多余的话        ...
来自微软的完成端口例子C++
来自微软的<em>完成端口</em>例子,就讲解一下它的使用套路吧 反正编程这个玩意,只要用过,自然就知道什么回事,一次不会再看一次,学习这个玩意,无他,勤奋而已。 奢谈效率等等,那只是孰能生巧上的功夫。    这个例子是在console下的例子,算是一个echo服务器吧,
完成端口模型IOCP详解 (一)
Normal 0 7.8 磅 0 2
C++完成端口组件实现
在windows平台上,处理众多的TCP连接的机制中效率最高的是<em>完成端口</em>模型,关于<em>完成端口</em>模型的介绍可参照《Win32 多<em>线程</em>程序设计》(侯捷翻译)和《windows网络编程》。异步机制是<em>完成端口</em>的基础,<em>完成端口</em>模型的本质思想是将"启动异步<em>操作</em>的<em>线程</em>"和"提供服务的<em>线程</em>"(即工作者<em>线程</em>)拆伙。先看看所有TCP连接管理组件都要实现的接口 ITcpManager #ifndef ITCPMANAGER
完成端口学习笔记(二):完成端口实现机制的仿真
上一篇关于“<em>完成端口</em>”的文章中,我们讲解了在同一个控制台程序中完成本地文件的拷贝,利用的是ReadFile和WriteFile两个API函数。本篇将讲解一下怎样利用<em>完成端口</em>来完成网络文件的拷贝,即通过网络将客户端的文件传输到服务端。只要用过Windows套接字编程的人都可以很容易的实现这个转换过程。本博文中首先直接给出利用<em>完成端口</em>来实现文件网络传输的核心示例代码,然后通过解决上述过程“内存泄露”问
完成端口(CompletionPort)详解》源码
文章在此:https://blog.csdn.net/piggyxp/article/details/6922277 原文的源码缺失,在此补上。
Socket编程模型之完成端口模型
用完成例程来实现重叠I/O比用事件通知简单得多。在这个模型中,主<em>线程</em>只用不停的接受连接即可;辅助<em>线程</em>判断有没有新的客户端连接被建立,如果有,就为那个客户端套接字激活一个异步的WSARecv<em>操作</em>,然后调用SleepEx使<em>线程</em>处于一种可警告的等待状态,以使得I/O完成后CompletionROUTINE可以被内核调用。如果辅助<em>线程</em>不调用SleepEx,则内核在完成一次I/O<em>操作</em>后,无法调用完成例程(因为完成例程的运行应该和当初激活WSARecv异步<em>操作</em>的代码在同一个<em>线程</em>之内)。
完成端口(IOCP)高性能服务器源码
最近有项目要做一个高性能网络服务器,决定下功夫搞定<em>完成端口</em>(IOCP),最终花了一个星期终于把它弄清楚了,并用C++写了一个版本,效率很不错。 但,从项目的总体需求来考虑,最终决定上.net平台,因此又花了一天一夜弄出了一个C#版,在这与大家分享。 一些心得体会: 1、在C#中,不用去面对<em>完成端口</em>的<em>操作</em>系统内核对象,Microsoft<em>已经</em>为我们提供了SocketAsyncEventArgs类,它封装了IOCP的使用。请参考:http://msdn.microsoft.com/zh-cn/library/system.net.sockets.socketasynceventargs.aspx?cs-save-lang=1&cs-lang=cpp#code-snippet-1。 2、我的SocketAsyncEventArgsPool类使用List对象来存储对客户端来通信的SocketAsyncEventArgs对象,它相当于直接使用内核对象时的IoContext。我这样设计比用堆栈来实现的好处理是,我可以在SocketAsyncEventArgsPool池中找到任何一个与服务器连接的客户,主动向它发信息。而用堆栈来实现的话,要主动给客户发信息,则还要设计一个结构来存储已连接上服务器的客户。 3、对每一个客户端不管还<em>发送</em><em>还是</em>接收,我使用同一个SocketAsyncEventArgs对象,对每一个客户端来说,通信是同步进行的,也就是说服务器高度保证同一个客户连接上要么在投递<em>发送</em>请求,并等待;或者是在投递接收请求,等待中。本例只做echo服务器,还未考虑由服务器主动向客户<em>发送</em>信息。 4、SocketAsyncEventArgs的UserToken被直接设定为被接受的客户端Socket。 5、没有使用BufferManager 类,因为我在初始化时给每一个SocketAsyncEventArgsPool中的对象分配一个缓冲区,<em>发送</em>时使用Arrary.Copy来进行字符拷贝,不去改变缓冲区的位置,只改变使用的长度,因此在下次投递接收请求时恢复缓冲区长度就可以了!如果要主动给客户发信息的话,可以new一个SocketAsyncEventArgs对象,或者在初始化中建立几个来专门用于主动<em>发送</em>信息,因为这种需求一般是进行信息群发,建立一个对象可以用于很多次信息<em>发送</em>,总体来看,这种花销不大,还减去了字符拷贝和消耗。 6、测试结果:(在我的笔记本上时行的,我的本本是T420 I7 8G内存) 100客户 100,000(十万次)不间断的<em>发送</em>接收数据(<em>发送</em>和接收之间没有Sleep,就一个一循环,不断的<em>发送</em>与接收) 耗时3004.6325 秒完成 总共 10,000,000 一千万次访问 平均每分完成 199,691.6 次<em>发送</em>与接收 平均每秒完成 3,328.2 次<em>发送</em>与接收 整个运行过程中,内存消耗在开始两三分种后就保持稳定不再增涨。 看了一下对每个客户端的延迟最多不超过2秒。
完成端口IOCP+UDP源码
<em>完成端口</em> IOCP+UDP的架构,代码为C++在 vs2015下编写的.
ReadDirectoryChangesW---异步方式(IO完成端口)监控目录中的文件
同步方式处理的话如果多个文件有可能有处理不到的文件。采用异步方式可以解决这个问题。 基于IO<em>完成端口</em>实现的封装类class P2PFileShare: #if !defined(AFX_P2PFILESHARE_H__5CFE59EF_7A09_4715_885F_FED4E2992470__INCLUDED_) #define AFX_P2PFILESHARE_H__5CFE59EF_7A0
PiggyXP 完成端口的源码
作者原来的项目代码<em>已经</em>不能下载了,这里补上, 作者文章地址:http://blog.csdn.net/piggyxp/article/details/6922277 包含以下文件 IOCPExample_By_PiggyXP.rar PiggyStressTestClient.rar
IOCP问题总结(recv阻塞/死锁/线程堆栈溢出)
//群发,异常时不关闭socket,(关闭会出现异常(死锁?!),而不关闭最多客户端少收一些数据而已),再者,这里在关闭,而SocketArray_->GetActiveItem(i)又在获取。。。 //会发生类似这样的死锁:AcceptThread的RecvData要<em>进入</em>锁,但OnRecvComplete却阻塞在recv处,为什么会阻塞在这里?可能是CloseSocket是,破坏了某些数据,如
iocp网络通信之如何判断客户端连接断开
BOOL r = ::GetQueuedCompletionStatus(hCompletionPort, &dwBytesTransferred, (LPDWORD)&hCompletionSocket, (LPWSAOVERL APPED *) &lpOvlpEx, INFINITE); if (hCompletionSocket== INVALID_SOCKET || lpOv
重叠iO和完成端口模型
重叠iO和<em>完成端口</em>模型
用I/O完成端口+socket编写客户端demo实现Http下载
//暂时先把已完成的部分记录下来,这个demo先暂停下来,这个还没有实现好的。 最近学习了一些网络编程的知识,想要在vs2015下实现一个控制台应用程序,通过命令行启动, 启动方式:client url download_path 可以从指定的下载地址把文件下载到本地指定的路径。socket下载流程: 1.初始化winscok库。 2.解析url,根据url规范,一个url地址长这样:(协
完成端口 WSASend
当连接不到200个客户端时,WSASend出现错误.WSAENOBUFS,10055,为什么啊?利用setsockopt增加<em>发送</em>的缓存区也不行.请大家帮帮忙啊.
完成端口,WSASend
<em>完成端口</em>服务器做视频数据服务器,每用户带宽为15KB左右,rn当服务器用户达到600时,服务器会出现非页面缓冲区持续不断增长,达到-定量后,rn客户端再也连不进去了, 而服务器内存占用量基本没有多大变化..rnrn不知是不跟大量数据都通过WSASend<em>发送</em>有关?请高手指教!
Delphi 完成端口使用
Delphi <em>完成端口</em>相关函数。 FCompletionPort : THandle; //<em>完成端口</em>的相关信息 //创建<em>完成端口</em> 1、FCompletionPort := CreateIOCompletionPort(INVALID_HANDLE_VALUE, 0, 0, 0); 参数: __in HANDLE FileHandle, __in_
使用IOCP需要注意的一些问题~~(不断补充)
1- 不要为每个小数据包<em>发送</em>一个IOCP请求,这样很容易耗尽IOCP的内部队列.....从而产生10055错误. 2- 不要试图在<em>发送</em>出IOCP请求之后,收到完成通知之前修改请求中使用的数据缓冲的内容,因为在这段时间,系统可能会来读取这些缓冲.   3- 为了避免内存拷贝,可以尝试关闭SOCKET的<em>发送</em>和接收缓冲区,不过代价是,你需要更多的接收请求POST到一个数据流量比较大的SOCKE
完成端口(IOCP)实现高性能网络服务器(源码 C#)
<em>完成端口</em>(IOCP)实现高性能网络服务器(源码 C#) 最近有项目要做一个高性能网络服务器,决定下功夫搞定<em>完成端口</em>(IOCP),最终花了一个星期终于把它弄清楚了,并用C++写了一个版本,效率很不错。 但,从项目的总体需求来考虑,最终决定上.net平台,因此又花了一天一夜弄出了一个C#版,在这与大家分享。 一些心得体会: 1、在C#中,不用去面对<em>完成端口</em>的<em>操作</em>系统内核对象
完成端口(Completion Port)实现思路浅析
<em>完成端口</em>(Completion Port)实现思路浅析  http://www.blogcn.com/user8/flier_lu/index.html?id=2401390&amp;amp;run=.0D9CAA6<em>完成端口</em>是 NT 架构下一种高效的异步 IO 辅助机制,其使用方法<em>已经</em>被广为讨论,MSDN里面也有很详细的说明和示例。《Windows网络编程》一书中有关于通过<em>完成端口</em>实现高...
c++版IOCP完成端口源码
用C++实现的,能高并发(可自己设定)和高连接数(20000以上)的TCP与UDP两种协议IOCP封装源码。有效解决了掉线、死机、超时的基本问题。
Windows下完成端口线程
http://www.cnblogs.com/snailrun/archive/2012/08/17/2644861.html
等待线程结束的高手--WaitForSingleObject
等待<em>线程</em>结束的高手--WaitForSingleObject 用户模式的<em>线程</em>同步机制效率高,如果需要考虑<em>线程</em>同步问题,应该首先考虑用户模式的<em>线程</em>同步方法。 但是,用户模式的<em>线程</em>同步有限制,对于多个进程之间的<em>线程</em>同步,用户模式的<em>线程</em>同步方法无能为力。这时,只能考虑使用内核模式。 Windows提供了许多内核对象来实现<em>线程</em>的同步。对于<em>线程</em>同步而言,这些内核对象有两个非常重要的状态:“已通
UDP完成端口 Demo (改)
看过一些人写的<em>完成端口</em>但不能真正的使用并发,这是一个<em>完成端口</em>应有基本结构。 代码没变,删除了以前包含没有用的二进制文件。
关于SpringBoot bean无法注入的问题(与文件包位置有关)
问题场景描述整个项目通过Maven构建,大致结构如下: 核心Spring框架一个module spring-boot-base service和dao一个module server-core 提供系统后台数据管理一个module server-platform-app 给移动端提供rest数据接口一个module server-mobile-api 其中server-platform-app 与
ADT-10.0.1下载
android在eclipse和myeclipse下的插件 最新版的 相关下载链接:[url=//download.csdn.net/download/lu900618/3098947?utm_source=bbsseo]//download.csdn.net/download/lu900618/3098947?utm_source=bbsseo[/url]
3M互助直销系统源码下载
3M互助直销系统源码,比MMM更大方,功能更人性化,可自动配对和手动配对,一切全自动执行无需人工干预,商业版售价8000多,分享给大家,以便交流学习,不知道什么是3M的,大家可以去百度一下吧 相关下载链接:[url=//download.csdn.net/download/lbq668/9310997?utm_source=bbsseo]//download.csdn.net/download/lbq668/9310997?utm_source=bbsseo[/url]
大连理工大学网络实验一下载
大连理工大学网络实验一:RJ45接口网线制作 相关下载链接:[url=//download.csdn.net/download/yaopj/2056227?utm_source=bbsseo]//download.csdn.net/download/yaopj/2056227?utm_source=bbsseo[/url]
文章热词 设计制作学习 机器学习教程 Objective-C培训 交互设计视频教程 颜色模型
相关热词 mysql关联查询两次本表 native底部 react extjs glyph 图标 java 基础学习完了 我已经学习了java
我们是很有底线的