说说eMule中的大多数通信类的基类CAsyncSocketEx
1、先看看静态链表m_spAsyncSocketExThreadDataList
其数据成员定义如下:
struct t_AsyncSocketExThreadData
{
CAsyncSocketExHelperWindow *m_pHelperWindow; //线程中的socket事件接收窗口
int nInstanceCount; //线程中CAsyncSocketEx 实例的个数
DWORD nThreadId; //线程id
}
在每个线程中,只有一个m_pHelperWindow,所有的CAsyncSocketEx 实例的socket事件都会发送到这个窗口。
m_pHelperWindow可以依据收到的通知消息message,获取相应的CAsyncSocketEx 实例 指针。
1、CAsyncSocketEx 在socket 事件通知消息派发上,速度要快于CAsyncSocket。
m_pHelperWindow里面有一个数组指针m_pAsyncSocketExWindowData,其成员对应线程中的每一个socket信息。
CAsyncSocketEx 的实例调用WSAAsyncSelect(SOCKET hSocket, HWND hWnd, int wMsg, long lEvent) 函数将hSocket上发生的事件通知发送消息wMsg给hWnd,其中wMsg-WM_SOCKETEX_NOTIFY 即为m_pAsyncSocketExWindowData中的数组下标,因此,在m_pHelperWindow接收到消息通知时,可以直接通过
m_pAsyncSocketExWindowData[wMsg-WM_SOCKETEX_NOTIFY]得到对应CAsyncSocketEx 指针,而在CAsyncSocket中,是通过socket线程状态中的m_plistSocketNotifications遍历获取socket指针的,因此,在线程的socket数量很多的情况下,CAsyncSocketEx 在事件通知消息派发上,速度要明显快于CAsyncSocket。
2、CAsyncSocketEx 提供一个灵活的分层系统,可以方便地在它的实例中添加代理支持,支持socks 4、socks 4a、socks 5 和http 1.0 、http1.1代理,以后还会增加SSL 安全连接支持。