为何CSocket的对象不让Close()
有个TCP方式的连接
class CListenSocket : public CAsyncSocket
其在Listen和Accept的时候:
void CListenSocket::OnAccept(int nErrorCode)
{
CAsyncSocket::OnAccept(nErrorCode);
CReceiveSocket *pRequest = new CReceiveSocket(pOwner);
if ( Accept( *pRequest ) )
{
pRequest->AsyncSelect( FD_READ|FD_CLOSE );
pOwner->m_connectionList.AddTail( pRequest );//此处将请求连接放入LIst中缓存。
}
else
delete pRequest;
}
class CReceiveSocket : public CSocket
问题是我在某动作后会清此连接链链表调用CloseTcpSocket,会出错:
void CMyDoc::CloseTcpSocket()
{
POSITION pos,temp;
for(pos = m_connectionList.GetHeadPosition(); pos != NULL;)
{
temp = pos;
CReceiveSocket* pSock = (CReceiveSocket*) m_connectionList.GetNext(pos);
if (pSock != NULL)
{
pSock->Close();//此句出错
m_connectionList.RemoveAt(temp);
delete pSock;
}
}
}
pSock->Close();//出错的提示是CSocket::Close()中的VERIFY(ASyncSelect(0));导致CAsyncSocket::AsyncSelect()中的ASSERT(pState->m_hSocketWindow != NULL);此处句柄为空!!!
还有问题是同样的CloseTcpSocket()我在CMyDoc::~CMyDoc()调用就没有问题:
CMyDoc::~CMyDoc()
{
...
CloseTcpSocket();
...
}