Windows上的异步通信程序库CAsyncSocketEx

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的目的。

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

Windows上的异步通信程序库CAsyncSocketEx

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

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

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

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

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

Windows上的异步通信程序库CAsyncSocketEx

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

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



-------------------------------------------------------------------------------------------------

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