程序在动态编译后 运行正常 但程序改为静态编译 在运行过程中会崩溃 经常调试 发现会触发一个断言
ASSERT(CAsyncSocket::LookupHandle(hSocket, bDead) == NULL);
if (pState->m_pmapSocketHandle->IsEmpty()) 程序运行到这里就会崩溃 网上查了很多 方法 试了都不行 最后在http://support2.microsoft.com/kb/193101/zh-cn
发现 需要为每个线程创建套接字使用句柄映射
具体只需要在代码加一个函数
void SocketThreadInit()
{
#ifndef _AFXDLL
#define _AFX_SOCK_THREAD_STATE AFX_MODULE_THREAD_STATE
#define _afxSockThreadState AfxGetModuleThreadState()
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
if (pState->m_pmapSocketHandle == NULL)
pState->m_pmapSocketHandle = new CMapPtrToPtr;
if (pState->m_pmapDeadSockets == NULL)
pState->m_pmapDeadSockets = new CMapPtrToPtr;
if (pState->m_plistSocketNotifications == NULL)
pState->m_plistSocketNotifications = new CPtrList;
#endif
}
然后在每个线程的开始调用 SocketThreadInit(); 就可以了
或者可以更简单 在每个线程的开始调用 AfxSocketInit()。也可以
这是一个bug 但是微软很早就已经修复了