首先CAsyncSocket采用的WSAAsynSelect模型,WSAAsynSelect是一种异步I/O模型,通过该模型,应用程序可以接收以Windows消息为基础的网络事件通知。而我们这里讲的就是CSocketWnd,它是从CWnd继承的。
从源码中看出它只处理两个消息,一个是WM_SOCKET_NOTIFY,另一个是WM_SOCKET_DEAD。
我原以为没创建一个Socket就会创建一个CSocketWnd,其实不是,是所有的Socket共享一个CSocketWnd,其实想想也是,要是每创建一个Socket就创建一个CSocketWnd那开销也大了点。
既然是共享的,那它放在哪里呢?
全局中有这样一个结构体:_AFX_SOCK_THREAD_STATE,它保存一个那个共享的窗口句柄:m_hSocketWindow。
当没有创建Socket时,它是Null的。
除了m_hSocketWindow结构体_AFX_SOCK_THREAD_STATE还有几个重要的变量:
1. mCEmbeddedButActsLikePtr<CMapPtrToPtr> m_pmapSocketHandle:记录了CAysncSocket*与没死的SOCKET的映射关系
2. CEmbeddedButActsLikePtr<CMapPtrToPtr> m_pmapDeadSockets:记录了SOCKET与死了的次数的映射关系
3. CEmbeddedButActsLikePtr<CPtrList> m_plistSocketNotifications:记录的所有的SOCKET事件的通知消息
每当调用Attach时,Attach调用AttachHandle,在AttachHandle把一个CAysncSocket*和SOCKET加入m_pmapSocketHandle中,
当调用Socket时也会调用AttachHandle,与之对于是Detach.
当一个非死亡事件发生时,会向m_hSocketWindow发送WM_SOCKET_NOTIFY,其消息处理函数如下
CSocket::AuxQueueAdd(WM_SOCKET_NOTIFY, wParam, lParam);源码如下:
接到消息以后把它放入:m_plistSocketNotification中
CSocket::ProcessAuxQueue(WM_SOCKET_NOTIFY, wParam, lParam);源码如下:
从中考研看出最终调用的是:CAsyncSocket::DoCallBack,源码如下:
消息WM_SOCKET_DEAD处理函数与WM_SOCKET_NOTIFY是一样的
从中考研清楚的看出CAsyncSocket的事件处理过程。
以上一定会有一些错误,请各位路过的大侠指正,不胜感激。