这是服务器端的代码,当有客户端进行过通讯这段代码就会出问题,如果没有通讯直接退出就没有问题,服务器会当掉,即没有反应,就好像死掉一样。问题见下面描述
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.   

    pSock->ShutDown()是多余的
      

  2.   

    close会隐式调用,但msdn还是推荐显示调用的好。
      

  3.   

    没有发现new,怎么要用delete?
      

  4.   

    肯定有new的拉。m_ConSockList是CPtrList来的。
      

  5.   

    当然会有问题了,你的CLIENT SOCKET是通过这个LIST取得了,你先把它REMOVE了,内存就被释放了.
    你怎么关?
      

  6.   

    晕!上面说了CPtrList的元素是new来的。remove只是把元素从list里删除。
    那位大牛给个解答啊?
    一下为我的猜想:
    如果remove之后再delete加上个sleep
    就不会有问题,如果不加就有问题,我想是不是把remove放在后面
    时执行remove会有延迟,相当于调用了sleep了。但是delete之后为什么
    要延迟一下呢?
      

  7.   

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

  8.   

    会不会是在不同线程处理socket出错了.比如,shutdown的时候指定both,把send和recv的buffer都清空??