我的程序采用CAsyncSocket连接多台主机的SERVER端,运行一段时间后(不定期),报出ASSERT错误,发现是SOCKCORE.CPP的第512行ASSERT(pSocket != NULL);   由于该问题不定期出现(在用户的机器上),后来我在公司的机器上进行模拟测试,加大数据量,并模拟网络断开,断掉重联,客户端不断向多台主机的服务器程序发送消息,服务器端程序也不停的向我的程序发送消息,中间还自动关闭连接(服务器端),拔掉网线,我的程序自动连接服务器端程序,但是,无论怎样测试,均无法模拟出该问题.   现在确实判断不错问题在哪里,向大家请教.

解决方案 »

  1.   

    ........-_-b你这么折腾都发现不了问题我也想不出anything else了
      

  2.   

    楼主看看代码发现不了问题吗??就是pSocket在不该为空的时候被释放掉了啊
      

  3.   

    你发布的是什么版本的应用程序?ASSERT这个宏只能在debug版本的文件里面存在阿,难道你把debug版的文件给用户?你看看是不是用户的机器有问题?或者你查查那里对pSocket进行了操作,在什么地方失败了
      

  4.   

    ASSERT
    MFC的类里总是这么干!!!
    肯定是楼主代码出问题了,同意: PiggyXP(【小猪】●你快乐于是我快乐)
    楼主看看代码发现不了问题吗??就是pSocket在不该为空的时候被释放掉了啊楼主SOCKET断开的时候有没有做处理呀!
      
      

  5.   

    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;
    }
    }MFC中报出ASSERT错误的代码为 ASSERT(pSocket != NULL);可是 pSocket = CAsyncSocket::LookupHandle(INVALID_SOCKET, FALSE);
    这个指针怎么会是NULL呢?难道是在进入此函数时,该SOCKET已经被关闭了,并且资源被清除了?    我在OnClose()部分是这样处理的:
    void CClientSocket::OnClose(int nErrorCode) 
    {
    // TODO: Add your specialized code here and/or call the base class
    Close(); m_bConnect=FALSE;
    m_bReport=TRUE;
    m_pDoc->ReportConnectClose();
    CAsyncSocket::OnClose(nErrorCode);
    }
      

  6.   

    是不是必须在OnClose()函数中加入ShutDown()如下所示:ShutDown();
              Close();
      

  7.   

    在Close();后
    pSocket = NULL;