这是服务器端的代码,当有客户端进行过通讯这段代码就会出问题,如果没有通讯直接退出就没有问题,服务器会当掉,即没有反应,就好像死掉一样。问题见下面描述
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 ;
}
}
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 ;
}
}
是CSocket继承下来得。
remove之后再delete不是一样吗?remove函数又不会对pSock的地址
产生影响的。而且奇怪的是如果remove之后再delete加上个sleep
就不会有问题,如果不加就有问题,我想是不是把remove放在后面
时执行remove会有延迟,相当于调用了sleep了。但是delete之后为什么
要延迟一下呢?