这是服务器端的代码,当有客户端进行过通讯这段代码就会出问题,如果没有通讯直接退出就没有问题,服务器会当掉,即没有反应,就好像死掉一样。问题见下面描述
case USERQUIT :
{
    g_CriticalSec.Lock() ;
    CQQServerApp *pApp = (CQQServerApp*)AfxGetApp() ;
    POSITION pos = pApp->m_ConSockList.GetHeadPosition() ;
   while(pos)
   {
POSITION PrePos = pos ;
CClientSocket *pSock = (CClientSocket *)pApp->m_ConSockList.GetNext(pos) ;
if(pSock->GetRoom()==m_msg.strRoom && pSock->GetUser()==m_msg.strName)
{
           pApp->m_ConSockList.RemoveAt(PrePos) ;
pSock->ShutDown() ;

pSock->Close() ;
delete pSock ;
Sleep(50) ;//如果把sleep去掉当就有问题,或者去掉sleep而把pApp-                             //>m_ConSockList.RemoveAt(PrePos) ;移到这里就没有问题

           break ;
}
}

解决方案 »

  1.   

    是哪 一句有问题啊,然后是用MFC的CSocket类吗
      

  2.   

    g_CriticalSec应该是一个临界区吧,只有Lock()没有UnLock()的?
      

  3.   

    UnLock()写漏了,在后面有得。
    是CSocket继承下来得。
      

  4.   

    pApp->m_ConSockList.RemoveAt(PrePos) ;是应该放到delete()后面,也不需要Sleep()。
      

  5.   

    楼上的大哥,为什么呢?
    remove之后再delete不是一样吗?remove函数又不会对pSock的地址
    产生影响的。而且奇怪的是如果remove之后再delete加上个sleep
    就不会有问题,如果不加就有问题,我想是不是把remove放在后面
    时执行remove会有延迟,相当于调用了sleep了。但是delete之后为什么
    要延迟一下呢?
      

  6.   

    延迟,让socket内部做处理后在销毁