我利用CAsyncSocket实现客户端与服务器端的SOCKET通信,客户端同时与50多个服务器建立连接,也就是说,一个客户端要建立50多个连接,程序运行一段时间3、4天吧,有时也不一定,就会出现ASSERT断言,我查了断言来自SOCKCORE.CPP文件中的第513行,代码如下:void PASCAL CAsyncSocket::DoCallBack(WPARAM wParam, LPARAM lParam)
{
if (wParam == 0 && lParam == 0)
return; // Has the socket be closed?
CAsyncSocket* pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE); // If yes ignore message
if (pSocket != NULL)
return; pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, FALSE);
if (pSocket == NULL)
{
// Must be in the middle of an Accept call
pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET, FALSE);
ASSERT(pSocket != NULL);   //在此处出现断言错误
pSocket->m_hSocket = (SOCKET)wParam;
CAsyncSocket::DetachHandle(INVALID_SOCKET, FALSE);
CAsyncSocket::AttachHandle(pSocket->m_hSocket, pSocket, FALSE);
} int nErrorCode = WSAGETSELECTERROR(lParam);
switch (WSAGETSELECTEVENT(lParam))
{
case FD_READ:
{
DWORD nBytes;
if (!pSocket->IOCtl(FIONREAD, &nBytes))
nErrorCode = WSAGetLastError();
if (nBytes != 0 || nErrorCode != 0)
pSocket->OnReceive(nErrorCode);
}
break;
case FD_WRITE:
pSocket->OnSend(nErrorCode);
break;
case FD_OOB:
pSocket->OnOutOfBandData(nErrorCode);
break;
case FD_ACCEPT:
pSocket->OnAccept(nErrorCode);
break;
case FD_CONNECT:
pSocket->OnConnect(nErrorCode);
break;
case FD_CLOSE:
pSocket->OnClose(nErrorCode);
break;
}
}在上述代码中标出了出现断言错误的位置。请教高人,这到底可能是什么问题呢?谢谢了。

解决方案 »

  1.   

    我看上面的注视中有一条:// Must be in the middle of an Accept call  这个不知道说明什么问题呢?是不是表示SOCKET正在进行什么处理,此时不能进行某种操作?
      

  2.   

    ASSERT(pSocket != NULL);   //在此处出现断言错误
    ////////////////////////////////////////////////////////pSocket为空,可能是你不小心关闭了,或是对方服务器关闭了该连接
      

  3.   

    可是在之前这段代码已经判断了SOKCET是否关闭,如果关闭的话,将直接返回了。不会执行后面的代码啊?另外还有一个问题,CAsyncSocket::LookupHandle()函数的第二个参数是什么含义呢?// Has the socket be closed?
    CAsyncSocket* pSocket = CAsyncSocket::LookupHandle((SOCKET)wParam, TRUE);// If yes ignore message
    if (pSocket != NULL)
    return;