设为首页 收藏本站
查看: 1307|回复: 0

[经验分享] Windows上的异步通信程序库CAsyncSocketEx

[复制链接]

尚未签到

发表于 2016-5-21 09:46:08 | 显示全部楼层 |阅读模式
Windows上的异步通信程序库CAsyncSocketEx




CAsyncSocketEx是一个叫Tim Kosse2003年发布到codeproject.com上的一个小程序库(http://www.codeproject.com/KB/IP/casyncsocketex.aspx),说是MFCCAsyncSocket的替代品和改进品。

作为异步通信,CAsyncSocketEx这一套的模型,或者说执行模式,和原来MFCCAsyncSocket类似,它们的异步都不是自己另外实现的,核心是调用Windows提供的接口WSAAsyncSelect()

WSAAsyncSelect(m_SocketData.hSocket,GetHelperWindowHandle(),m_SocketData.nSocketIndex+WM_SOCKETEX_NOTIFY,lEvent)

针对每个socket掉用WSAAsyncSelect(),之后一有这些socket的网络事件(比如收到网络数据,或是建立连接成功等)Windows会把socket的网络事件都投递到线程的消息队列,从而达到异步处理网络IO的目的。

它的大致架构如下图所示。


DSC0000.jpg



当线程创建第一个CAsyncSocketEx的时候,会实例化一个CAsyncSocketExHelperWindow。每个线程只有一个CAsyncSocketExHelperWindow

列表m_spAsyncSocketExThreadDataList是静态变量,记录所有创建CAsyncSocketEx的线程的IDHelperWindowCAsyncSocketEx的个数。

因为是异步的,所以也适合单线程程序使用。你可以一个线程处理所有事情,而不需要独立出一个独立线程做网络IO。当然一个线程包揽所有事情在某些场合有它的固有缺点,这里不详述。

CAsyncSocketExMFCCAsyncSocket的一个区别是,对网络事情的投递做了改进。在一个CAsyncSocketExHelperWindow(关联一个线程),每一个socket(CAsyncSocketEx)都映射不同的消息ID,这样消息到达窗口CAsyncSocketExHelperWindow的时候,直接以消息ID为索引访问数组,就直接得到对应的socket(CAsyncSocketEx),而不需要像MFCCAsyncSocket那样去查找。


CAsyncSocketEx还引入层的概念,可以在CAsyncSocketEx中插入若干层(CAsyncSocketExLayer),而不改变CAsyncSocketEx对外的编程接口。发送数据的时候,数据从第一层CAsyncSocketExLayer穿过知道最后一层,再到windowssocket接口,接收数据的路径则反过来,如下图。

DSC0001.jpg



有了这种灵活的层设计,CAsyncSocketEx程序库顺便把代理层也做了。你只要在程序中实例化一个CAsyncProxySocketLayer,并把它加到CAsyncSocketEx中就可以支持通过代理服务器连接了。支持SOCKS代理和HTTP代理。

CAsyncSocketEx电驴就有使用,关于它的实际应用,可以参考一下电驴的代码。





  
  -------------------------------------------------------------------------------------------------
  更多博文请订阅RSS,更多微博请关注@千里孤行Nerd
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-219793-1-1.html 上篇帖子: windows环境下python web开发环境安装配置 下篇帖子: Windows Embedded从入门到精通4月预告
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表