关闭socket的怪问题
这是服务器端的代码,当有客户端进行过通讯这段代码就会出问题,如果没有通讯直接退出就没有问题,服务器会当掉,即没有反应,就好像死掉一样。问题见下面描述
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 ;
}
}
问题点数:30、回复次数:9Top
1 楼quanbaoxiao(永不言败)回复于 2006-03-17 22:02:37 得分 0
自己顶一个Top
2 楼jjiaming(阿熊)回复于 2006-03-18 22:02:52 得分 3
是哪 一句有问题啊,然后是用MFC的CSocket类吗Top
3 楼Mackz(在相互)回复于 2006-03-18 23:05:53 得分 0
g_CriticalSec应该是一个临界区吧,只有Lock()没有UnLock()的?Top
4 楼quanbaoxiao(永不言败)回复于 2006-03-19 00:44:44 得分 0
UnLock()写漏了,在后面有得。
是CSocket继承下来得。Top
5 楼Mackz(在相互)回复于 2006-03-19 09:35:41 得分 3
pApp->m_ConSockList.RemoveAt(PrePos) ;是应该放到delete()后面,也不需要Sleep()。Top
6 楼quanbaoxiao(永不言败)回复于 2006-03-19 12:39:04 得分 0
楼上的大哥,为什么呢?
remove之后再delete不是一样吗?remove函数又不会对pSock的地址
产生影响的。而且奇怪的是如果remove之后再delete加上个sleep
就不会有问题,如果不加就有问题,我想是不是把remove放在后面
时执行remove会有延迟,相当于调用了sleep了。但是delete之后为什么
要延迟一下呢?
Top
7 楼quanbaoxiao(永不言败)回复于 2006-03-19 23:52:17 得分 0
高手怎么都不想助一下啊Top
8 楼quanbaoxiao(永不言败)回复于 2006-03-19 23:52:31 得分 0
高手怎么都不想助一下啊Top
9 楼littlebao(爱拼才会赢)回复于 2006-06-02 12:32:39 得分 24
延迟,让socket内部做处理后在销毁Top




