浅析CAsyncSocket

    首先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的事件处理过程。

以上一定会有一些错误,请各位路过的大侠指正,不胜感激。

 

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值