请问CSocket的Attach,Detach有什么作用,在什么场合下用比较合适,急.... 谢谢! 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 CAsyncSocket与SOCKE之间是通过一个线程局部存储的Map来实现映射关系的。Attach就是向这个局部存储的Map添加一项,Deatch就是从这个Map删除其自己。 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的源码就明白了。 Attach将CSocket绑定到一个Socket句柄Detach反之,返回一个句柄我一般用它们将CSocket绑定到一个API打开的Socket句柄,或者在多线程中线程之间传递socket连接 通俗的理解:Detach 和 Attach就像接力棒(SOCKET句柄就是接力棒)的两个人 Attach就是将一个句柄绑定一个对象上。 MFCSocs.exe Avoids Two Common MFC Socket Mistakeshttp://support.microsoft.com/default.aspx?scid=kb;EN-US;185728 文本框的滚动条怎么让它自动滚动显示最新信息啊 1万可用分,大家要多少我就散多少(一) 大哥!来看看! 请问winsock的几个问题 一个IP欺骗的问题 我想修改另外一个CLASS中的STATIC文本,为什么用下面这句话崩溃啊? 200分,请教在VC下如何模拟键盘输入汉字 加密/解密的DLL 如何得到CRichEdit当前的编辑位置? 谁知道在VC6里面可不可以使用命令行编译? 请教:CListCtrl的WM_MEASUREITEM怎么不触发呢? socket同步的问题!!!
Attach就是向这个局部存储的Map添加一项,Deatch就是从这个Map删除其自己。
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的源码就明白了。
Detach反之,返回一个句柄
我一般用它们将CSocket绑定到一个API打开的Socket句柄,或者在多线程中线程之间传递socket连接
就是将一个句柄绑定一个对象上。