VC的朋友们新年好!小弟自学MFC几个月,还是很菜,有两个套接字的问题不明白,请个位高手指点,先谢过罗!问题1  是关与CAsyncSocket的内部实现的一个函数,书中的原码:void PASCAL CAsyncSocket::AttachHandle(SOCKET hsocket, CAsyncSocket * pSocket, BOOL  bDead)
 { 
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;(这是什么,是创建一个线程吗?)
  if (!bDead)
      {
         ASSERT(CAsyncSocket::LookupHandle (hSocket, bDead ==NULL);
            if (pState->m_pmapSocketHandle->IsEmpty( )) (这函数是什么意思?)
               {          
                  CSoketWnd* pWnd = new CSocketWnd;
                  pWnd->m_hWnd=NULL;
                    
                     用pWnd的CreateEx创建一个窗口
               
             pState->m_hSocketWindow = pWnd->m_hWnd;
              }
            pState->m_pmapSocketHandle->SetAt((void*) hSocket, pSocket);
    }
      
       else
       {    /*拆除Socket*/
       }
为什么书中说只是第一CAsyncSocket 或起派生类实例创建的时候才创建这个窗口,到底pState是不是线程,如过是的话那这个线程是不是主要被WSAAsyncSelect占用用来监视套接字,有事件时发送消息,没有的话别的线程就做其它事  问题二 :也是CAsyncSocket的内部实现的一个函数
         void PASCAL CAsyncSocet::DoCallBack (WPARAM wParam, LPARAM lparam)
         
                   {
                       …………………………省略……………………
             pSocket=CAsynSocket::LookupHandle((SOCKET) wParam, FLASE);
                       if (pSocket==NULL) 
                          {
                              pSocket=CAsynSocket::LookupHandle           
                             (INVALID_SOCKET, FLASE);   (这是干什么用的)
                    ASSERT(pSocket->m_hSocket = (SOCKET) wParam;
                              CAsyncSocket::DetaHandle(INVALID_SOCKET,    
                                             FLASE);
                              CAsyncSocket::AttachHandle(pSocket->m_hSocket,  pSocket,  FLASE);(为什么要回到问题一那个函数,也就是间接调用DoCallBack的函数?)
                          }
                         …………………………………………………………
                   }
问题三:
       书上有一个从CAsyncSocket派生的类说是用双缓冲区管理Socket的数据,到底什么是双缓冲区。重载的OnSend函数的工能是试图发送缓冲区头部的数据,OnReceive的功能是读出的数据放在接收缓冲区的尾部。请问怎么控制数据放在尾部或头部?怎么只发送头部的数据?
               多谢罗!