谢谢!

解决方案 »

  1.   

    CAsyncSocket与SOCKE之间是通过一个线程局部存储的Map来实现映射关系的。
    Attach就是向这个局部存储的Map添加一项,Deatch就是从这个Map删除其自己。
      

  2.   

    void PASCAL CAsyncSocket::AttachHandle(
    SOCKET hSocket, CAsyncSocket* pSocket, BOOL bDead)
    {
    _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState; BOOL bEnable = AfxEnableMemoryTracking(FALSE);
    if (!bDead)
    {
    ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) == NULL);
    if (pState->m_pmapSocketHandle->IsEmpty())
    {
    ASSERT(pState->m_pmapDeadSockets->IsEmpty());
    ASSERT(pState->m_hSocketWindow == NULL); CSocketWnd* pWnd = new CSocketWnd;
    pWnd->m_hWnd = NULL;
    if (!pWnd->CreateEx(0, AfxRegisterWndClass(0),
    _T("Socket Notification Sink"),
    WS_OVERLAPPED, 0, 0, 0, 0, NULL, NULL))
    {
    TRACE(traceSocket, 0, "Warning: unable to create socket notify window!\n");
    AfxThrowResourceException();
    }
    ASSERT(pWnd->m_hWnd != NULL);
    ASSERT(CWnd::FromHandlePermanent(pWnd->m_hWnd) == pWnd);
    pState->m_hSocketWindow = pWnd->m_hWnd;
    }
    pState->m_pmapSocketHandle->SetAt((void*)hSocket, pSocket);
    }
    else
    {
    void* pvCount;
    INT_PTR nCount;
    if (pState->m_pmapDeadSockets->Lookup((void*)hSocket, pvCount))
    {
    nCount = (INT_PTR)pvCount;
    nCount++;
    }
    else
    nCount = 1;
    pState->m_pmapDeadSockets->SetAt((void*)hSocket, (void*)nCount);
    }
    AfxEnableMemoryTracking(bEnable);
    }void PASCAL CAsyncSocket::DetachHandle(SOCKET hSocket, BOOL bDead)
    {
    ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) != NULL); _AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
    if (!bDead)
    {
    pState->m_pmapSocketHandle->RemoveKey((void*)hSocket);
    if (pState->m_pmapSocketHandle->IsEmpty())
    {
    ASSERT(pState->m_hSocketWindow != NULL);
    CWnd* pWnd =
    CWnd::FromHandlePermanent(pState->m_hSocketWindow);
    ASSERT_VALID(pWnd); if (pWnd != NULL)
    {
    pWnd->DestroyWindow();
    delete pWnd;
    } pState->m_hSocketWindow = NULL; pState->m_pmapDeadSockets->RemoveAll(); while (!pState->m_plistSocketNotifications->IsEmpty())
    delete pState->m_plistSocketNotifications->RemoveHead();
    }
    }
    else
    {
    void* pvCount;
    INT_PTR nCount;
    if (pState->m_pmapDeadSockets->Lookup((void*)hSocket, pvCount))
    {
    nCount = (INT_PTR)pvCount;
    nCount--;
    if (nCount == 0)
    pState->m_pmapDeadSockets->RemoveKey((void*)hSocket);
    else
    pState->m_pmapDeadSockets->SetAt((void*)hSocket, (void*)nCount);
    }
    }
    }楼主看了这些MFC的源码就明白了。
      

  3.   

    Attach将CSocket绑定到一个Socket句柄
    Detach反之,返回一个句柄
    我一般用它们将CSocket绑定到一个API打开的Socket句柄,或者在多线程中线程之间传递socket连接
      

  4.   

    通俗的理解:Detach 和 Attach就像接力棒(SOCKET句柄就是接力棒)的两个人
      

  5.   

    Attach
    就是将一个句柄绑定一个对象上。
      

  6.   

    MFCSocs.exe Avoids Two Common MFC Socket Mistakeshttp://support.microsoft.com/default.aspx?scid=kb;EN-US;185728