First-chance exception :0xC0000008:Invalid Handle
有一个支持多Client.Socekt连接的 Server.Socket程序,每当有一个Client.Socket请求连接的时候,Server.Socket程序中会通过new出来一块区域存放Custom.Socket来建立和Client.Socket连接,new出来的Custom.Socket又存放到一个CList 里面。在Socket Server关闭的时候,要将CList中存放的Custom.Socket一个一个的取出来,调用Custom.Socket.closesocket(),然后,再将CList清空。程序运行没什么问题,调试环境下,调用Clist.RemoveHead()(我是从头开始移除的)时候出现:
First-chance exception in TCPServer.exe (NTDLL.DLL):0xC0000008:Invalid Handle。
进入到Clist.RemoveHead()内部,发现,RemoveHead()语句都可以执行,最后return 的时候出现上述错误,并且returnvalue的值也是正确的。代码如下:
CList<CTCPCustom_CE,CTCPCustom_CE&> m_ListClientSocket;
有连接请求:
if (FD_ISSET(pSocket->m_ServerSocket,&fdRead))
{
//如果调用了Listen,则表示触发了OnAccept事件
SOCKADDR_IN clientAddr;
CTCPCustom_CE * pClientSocket = new CTCPCustom_CE();
int namelen = sizeof(clientAddr);
//等待,创建与客户端连接的套接字
pClientSocket->m_socket = accept(pSocket->m_ServerSocket, (struct sockaddr *)&clientAddr, &namelen);
//接收到客户端连接
if (pClientSocket->m_socket)
{
pClientSocket->m_RemoteHost = inet_ntoa(clientAddr.sin_addr);
pClientSocket->m_RemotePort = ntohs(clientAddr.sin_port);
//触发与客户端建立连接事件
pSocket->OnClientConnect(pSocket->m_pOwnerWnd,pClientSocket);
//打开pClientSocket服务线程
pClientSocket->Open(pSocket);
//添加到客户端连接队列中
m_ListClientSocket.AddTail(*pClientSocket);
/*pClientSocketTemp=pClientSocket;*/
}
else
{
delete pClientSocket;
}
Server.Socket关闭的部分:
POSITION pos = m_ListClientSocket.GetHeadPosition();
while (pos != NULL)
{
CTCPCustom_CE &tmpTcpCustom = m_ListClientSocket.GetAt(pos);
if (!tmpTcpCustom.Close())
{
AfxMessageBox("关闭客户端socket错误");
}
m_ListClientSocket.RemoveHead();////这里调试的时候会出错,如前所述。
pos = m_ListClientSocket.GetHeadPosition();
}
问题:请大侠们分析出现在RemoveHead出现 First-chance exception in TCPServer.exe (NTDLL.DLL):0xC0000008:Invalid Handle
另外请问,那些new出来的,放在Clist中的Custom.Socket所占的内存会不会在RemoveHead的时候被一起释放掉?