Windows上的异步通信程序库CAsyncSocketEx
Windows上的异步通信程序库CAsyncSocketEx
CAsyncSocketEx是一个叫Tim Kosse的2003年发布到codeproject.com上的一个小程序库(http://www.codeproject.com/KB/IP/casyncsocketex.aspx),说是MFC的CAsyncSocket的替代品和改进品。
作为异步通信,CAsyncSocketEx这一套的模型,或者说执行模式,和原来MFC的CAsyncSocket类似,它们的异步都不是自己另外实现的,核心是调用Windows提供的接口WSAAsyncSelect()。
WSAAsyncSelect(m_SocketData.hSocket,GetHelperWindowHandle(),m_SocketData.nSocketIndex+WM_SOCKETEX_NOTIFY, lEvent)
针对每个socket掉用WSAAsyncSelect(),之后一有这些socket的网络事件(比如收到网络数据,或是建立连接成功等),Windows会把socket的网络事件都投递到线程的消息队列,从而达到异步处理网络IO的目的。
它的大致架构如下图所示。
当线程创建第一个CAsyncSocketEx的时候,会实例化一个CAsyncSocketExHelperWindow。每个线程只有一个CAsyncSocketExHelperWindow。
列表m_spAsyncSocketExThreadDataList是静态变量,记录所有创建CAsyncSocketEx的线程的ID,HelperWindow和CAsyncSocketEx的个数。
因为是异步的,所以也适合单线程程序使用。你可以一个线程处理所有事情,而不需要独立出一个独立线程做网络IO。当然一个线程包揽所有事情在某些场合有它的固有缺点,这里不详述。
CAsyncSocketEx与MFC的CAsyncSocket的一个区别是,对网络事情的投递做了改进。在一个CAsyncSocketExHelperWindow (关联一个线程)中,每一个socket(CAsyncSocketEx)都映射不同的消息ID,这样消息到达窗口CAsyncSocketExHelperWindow的时候,直接以消息ID为索引访问数组,就直接得到对应的socket(CAsyncSocketEx),而不需要像MFC的CAsyncSocket那样去查找。
CAsyncSocketEx还引入层的概念,可以在CAsyncSocketEx中插入若干层(CAsyncSocketExLayer),而不改变CAsyncSocketEx对外的编程接口。发送数据的时候,数据从第一层CAsyncSocketExLayer穿过知道最后一层,再到windows的socket接口,接收数据的路径则反过来,如下图。
有了这种灵活的层设计,CAsyncSocketEx程序库顺便把代理层也做了。你只要在程序中实例化一个CAsyncProxySocketLayer,并把它加到CAsyncSocketEx中就可以支持通过代理服务器连接了。支持SOCKS代理和HTTP代理。
CAsyncSocketEx电驴就有使用,关于它的实际应用,可以参考一下电驴的代码。
-------------------------------------------------------------------------------------------------