问题是这样子的:我在从CWinThread派生的类中使用CAsyncSocket。现在收发数据都正常,但当我在关闭Socket的时候,在pClientSocket->Close()前调用pSocket->AsyncSelect(0),发生错误,在堆栈中追踪,发现是一个断言错误,ASSERT(pState->m_hSocketWindow != NULL),这到底是怎么回事?怎么解决这个问题?我现在由于程序结构、以及和其他模块接口等问题,最好在线程中使用socket,如果非要在该线程中使用socket,是不是不能用MFC 的 CAsyncSocket类?期待各位高手伸手相助。代码如下:
        //清理客户端连接socket
POSITION pos = this->m_ClientInfoMap.GetStartPosition();
CNewSocket *pSocket = NULL;
CString strIPAddr;
for(pos;pos != NULL;)
{
             ////////////
 this->m_ClientInfoMap.GetNextAssoc(pos,strIPAddr,(void *&)pSocket);
 if(pSocket)
 {
 //..........................
 pSocket->m_bStopRead = true;
 ::WaitForSingleObject(pSocket->m_SockReadingEvent.m_hObject,2000);
 //pSocket->m_hSocket = NULL;
 pSocket->AsyncSelect(0);
 pSocket->Close();
 delete pSocket;
 pSocket = NULL;
 }
}
//删除侦听socket
if(m_pLisener->m_hSocket != INVALID_SOCKET)
{
//m_pLisener->ShutDown(2);
int nError = ::WSAGetLastError();
m_pLisener->AsyncSelect(0); m_pLisener->Close();
delete m_pLisener;
}

解决方案 »

  1.   

    你在使用AsyncSelect调用过AfxSocketInit吗?
      

  2.   

    1.CNewSocket可能有问题!!
    2.m_ClientInfoMap的类型是不是有问题,或者干脆就是非法指针
      

  3.   

    我是指.m_ClientInfoMap保存的pSocket指针有可能不正确
      

  4.   

    回复楼上的各位仁兄,该线程是从CWinThread派生的,之所以这么做,我是想用该线程的Windows消息队列,在其他线程中通过PostThreadMessage向该线程发消息。我在这个线程中创建和侦听和收发数据socket,删除socket对象也是在同一个线程中(如同上面程序代码)。在这种情况下,是不是不能用CAsyncSocket?如果能用,怎么处理。另外,目前,虽然能够运行下边的程序,也就是单步运行的时候不出错,但是,当 CWinThread线程退出时,会发生错误。从堆栈看,是socket还没有真正退出,正在接收数据(我关闭线程时,还有大量数据向socket发送)。 //清理客户端连接socket
    POSITION pos = this->m_ClientInfoMap.GetStartPosition();
    CNewSocket *pSocket = NULL;
    CString strIPAddr;
    for(pos;pos != NULL;)
    {
                 ////////////
     this->m_ClientInfoMap.GetNextAssoc(pos,strIPAddr,(void *&)pSocket);
     if(pSocket)
     {
     //..........................
     pSocket->m_bStopRead = true;
     pSocket->ShutDown(2);
     ::WaitForSingleObject(pSocket->m_SockReadingEvent.m_hObject,2000);
     pSocket->m_hSocket = INVALID_SOCKET;
     ::closesocket(pSocket->m_hSocket);
     
     pSocket->Close();
     
     delete pSocket;
     pSocket = NULL;
     }
    }
    //删除侦听socket

    if(m_pLisener->m_hSocket != INVALID_SOCKET)
    {
    m_pLisener->ShutDown(2);
    int nError = ::WSAGetLastError();
    m_pLisener->m_hSocket = INVALID_SOCKET; 
    ::closesocket(m_pLisener->m_hSocket);
    m_pLisener->Close();
    delete m_pLisener;
    }

    this->m_ClientInfoMap.RemoveAll();