【完成端口详解】 - 手把手教你玩转网络编程系列之三

PiggyXP 2011-11-01 08:49:11
加精
手把手叫你玩转网络编程系列之三
完成端口(Completion Port)详解

----- By PiggyXP(小猪)


前 言


本系列里完成端口的代码在两年前就已经写好了,但是由于许久没有写东西了,不知该如何提笔,所以这篇文档总是在酝酿之中……酝酿了两年之后,终于决定开始动笔了,但愿还不算晚…..

这篇文档我非常详细并且图文并茂的介绍了关于网络编程模型中完成端口的方方面面的信息,从API的用法到使用的步骤,从完成端口的实现机理到实际使用的注意事项,都有所涉及,并且为了让朋友们更直观的体会完成端口的用法,本文附带了有详尽注释的使用MFC编写的图形界面的示例代码。

我的初衷是希望写一份互联网上能找到的最详尽的关于完成端口的教学文档,而且让对Socket编程略有了解的人都能够看得懂,都能学会如何来使用完成端口这么优异的网络编程模型,但是由于本人水平所限,不知道我的初衷是否实现了,但还是希望各位需要的朋友能够喜欢。

由于篇幅原因,本文假设你已经熟悉了利用Socket进行TCP/IP编程的基本原理,并且也熟练的掌握了多线程编程技术,太基本的概念我这里就略过不提了,网上的资料应该遍地都是。

本文档凝聚着笔者心血,如要转载,请指明原作者及出处,谢谢!不过代码没有版权,可以随便散播使用,欢迎改进,特别是非常欢迎能够帮助我发现Bug的朋友,以更好的造福大家。^_^

本文配套的示例源码下载地址(在我的下载空间里)

http://piggyxp.download.csdn.net/

(里面的代码包括VC++2008/VC++2010编写的完成端口服务器端的代码,还包括一个对服务器端进行压力测试的客户端,都是经过我精心调试过,并且带有非常详尽的代码注释的。当然,作为教学代码,为了能够使得代码结构清晰明了,我还是对代码有所简化,如果想要用于产品开发,最好还是需要自己再完善一下,另外我的工程是用2010编写的,附带的2008工程不知道有没有问题,但是其中代码都是一样的,暂未测试)

忘了嘱咐一下了,文章篇幅很长很长,基本涉及到了与完成端口有关的方方面面,一次看不完可以分好几次,中间注意休息,好身体才是咱们程序员最大的本钱!

对了,还忘了嘱咐一下,因为本人的水平有限,虽然我反复修正了数遍,但文章和示例代码里肯定还有我没发现的错误和纰漏,希望各位一定要指出来,拍砖、喷我,我都能Hold住,但是一定要指出来,我会及时修正,因为我不想让文中的错误传遍互联网,祸害大家。

OK, Let’s go ! Have fun !



目录:

1. 完成端口的优点

2. 完成端口程序的运行演示

3. 完成端口的相关概念

4. 完成端口的基本流程

5. 完成端口的使用详解

6. 实际应用中应该要注意的地方



由于文章很长很长,麻烦感兴趣的朋友移步到我的博客中去排好版的看吧:)

http://blog.csdn.net/piggyxp/article/details/6922277

...全文
8514 115 打赏 收藏 转发到动态 举报
写回复
用AI写文章
115 条回复
切换为时间正序
请发表友善的回复…
发表回复
嗲爸 2013-10-29
  • 打赏
  • 举报
回复
C++不熟,有没有C#下面的完成端口类似版主这样详尽的应用代码供学习?
say_high 2013-01-11
  • 打赏
  • 举报
回复
正在学习中,拜读
悟迟 2012-12-29
  • 打赏
  • 举报
回复
正在看...
wushuang443 2012-12-21
  • 打赏
  • 举报
回复
bu不错
Squall_zy 2012-12-21
  • 打赏
  • 举报
回复
一年前的帖子,再顶一下。支持楼主这样愿意分享的人。 整篇文章我都仔细看了,源码也看了。质量很高,我也想谈下自己的观点。 1、不要过分迷信完成端口。如何理解每种模型,让应用更适应模型才是性能提升的关键。 2、关于网络通信的性能,微软API能做的无非这几件事:优化通告机制、优化内存拷贝、优化资源利用。 3、关于通告机制,“select模型主动查询”性能最差,“消息通告方式”性能次之,“利用核心对象通告”性能最佳。实际上EventSelect、IOCP均是核心对象通告。 4、关于内存拷贝,这才是性能的最大杀手。Overlapped这东西,才是灵魂。他的意义在于减少一次内存拷贝,通过投递用户缓冲区来实现数据交换。而且一定要“重叠”,要批量投递才能发挥性能。当你理解为什么IOCP下的socket缓冲区可以设为0的时候,当你理解为什么winsock 2.0要费尽心机的提供分散聚合读写操作的时候,你才能懂得性能并非IOCP这么简单。另外,看到楼主源码中_PER_IO_CONTEXT这个结构体的时候,我叹气了,这就是就是为了“易用”而做出的对性能的牺牲。 性能不在于模型,性能在于你如何去设计应用,让模型与之更好的匹配。
bustoy 2012-12-21
  • 打赏
  • 举报
回复
正在收集相关的资料,谢谢!
louifox 2012-05-03
  • 打赏
  • 举报
回复
但是要做到这种神奇的效果,应该确保我们在结构体PER_IO_CONTEXT定义的时候,把Overlapped变量,定义为结构体中的第一个成员。

Overlapped是第一个成员的话就没必要用CONTAINING_RECORD了
hubo520891 2012-04-28
  • 打赏
  • 举报
回复
顶,感谢楼主分享
一拳超超人 2012-04-27
  • 打赏
  • 举报
回复
楼主太好了。真的很感谢你。
大明白 2012-04-24
  • 打赏
  • 举报
回复
可以把发送消息的代码共享不?yangdm0209@163.com
Ginie 2012-04-07
  • 打赏
  • 举报
回复
全力支持
hubo520891 2012-04-06
  • 打赏
  • 举报
回复
学习下、多谢分享
DavidHsing 2012-04-05
  • 打赏
  • 举报
回复
赞一个,支持一下
  • 打赏
  • 举报
回复
我来的应该不算晚吧
谢谢楼主分享经验
XING979020 2012-04-04
  • 打赏
  • 举报
回复
先不看内容,也在回复了、

向楼主敬礼
jinxiuliwen99 2012-03-05
  • 打赏
  • 举报
回复
太详细太全面了!!
亚细亚 2012-03-01
  • 打赏
  • 举报
回复
最近用重叠I/O(overlapped I/O)完成了一个项目;还没有看完成端口这部分内容;抽空看看LZ的完成端口;
iceximo 2012-02-28
  • 打赏
  • 举报
回复
楼主的文章真是不错,收藏下来慢慢看
baiyanshuai444 2012-01-19
  • 打赏
  • 举报
回复
真是好东西啊,太及时了!正在做这方面的东西呢!
lsxsxs 2011-12-01
  • 打赏
  • 举报
回复
我想请教一下发送数据该怎么弄呢,我鼓捣了几天硬是不知道怎么发送,楼主能给个发送的代码吗,我太菜了。
加载更多回复(79)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧