问题是这样子的:我在从CWinThread派生的类中使用CAsyncSocket。现在收发数据都正常,但当我在关闭Socket的时候,在pClientSocket->Close()前调用pSocket->AsyncSelect(0),发生错误,在堆栈中追踪,发现是一个断言错误,ASSERT(pState->m_hSocketWindow != NULL),这到底是怎么回事?怎么解决这个问题?我现在由于程序结构、以及和其他模块接口等问题,最好在线程中使用socket,如果非要在该线程中使用socket,是不是不能用MFC 的 CAsyncSocket类?期待各位高手伸手相助。代码如下:
//清理客户端连接socket
POSITION pos = this->m_ClientInfoMap.GetStartPosition();
CNewSocket *pSocket = NULL;
CString strIPAddr;
for(pos;pos != NULL;)
{
////////////
this->m_ClientInfoMap.GetNextAssoc(pos,strIPAddr,(void *&)pSocket);
if(pSocket)
{
//..........................
pSocket->m_bStopRead = true;
::WaitForSingleObject(pSocket->m_SockReadingEvent.m_hObject,2000);
//pSocket->m_hSocket = NULL;
pSocket->AsyncSelect(0);
pSocket->Close();
delete pSocket;
pSocket = NULL;
}
}
//删除侦听socket
if(m_pLisener->m_hSocket != INVALID_SOCKET)
{
//m_pLisener->ShutDown(2);
int nError = ::WSAGetLastError();
m_pLisener->AsyncSelect(0); m_pLisener->Close();
delete m_pLisener;
}
//清理客户端连接socket
POSITION pos = this->m_ClientInfoMap.GetStartPosition();
CNewSocket *pSocket = NULL;
CString strIPAddr;
for(pos;pos != NULL;)
{
////////////
this->m_ClientInfoMap.GetNextAssoc(pos,strIPAddr,(void *&)pSocket);
if(pSocket)
{
//..........................
pSocket->m_bStopRead = true;
::WaitForSingleObject(pSocket->m_SockReadingEvent.m_hObject,2000);
//pSocket->m_hSocket = NULL;
pSocket->AsyncSelect(0);
pSocket->Close();
delete pSocket;
pSocket = NULL;
}
}
//删除侦听socket
if(m_pLisener->m_hSocket != INVALID_SOCKET)
{
//m_pLisener->ShutDown(2);
int nError = ::WSAGetLastError();
m_pLisener->AsyncSelect(0); m_pLisener->Close();
delete m_pLisener;
}
解决方案 »
- mfc
- CString类的问题
- VC编程,如何获得IE浏览器所打开网页中链接或控件在IE浏览器窗口客户区中的坐标
- Get网页内容后,保存为一个CString后如何进行不考虑大小写的查找FindNoCase和替换FindReplaceNoCase,
- 打印的问题
- VC如何把单文档程序加入到多文档中,有没有例子呢。感谢,
- 请问哪有SourceSafe的学习资料?
- CopyFile 钩子 问题
- 结构体 转化成 char*
- 如何让CListCtrl中的Item在选中的情况下自动的变成不选中?
- Ado 中使用delete的问题(贵在参与!!!!!!!!!!!!!!!!!!!)
- 给点思路->想读去另外一个IE中网页上的内容.
2.m_ClientInfoMap的类型是不是有问题,或者干脆就是非法指针
POSITION pos = this->m_ClientInfoMap.GetStartPosition();
CNewSocket *pSocket = NULL;
CString strIPAddr;
for(pos;pos != NULL;)
{
////////////
this->m_ClientInfoMap.GetNextAssoc(pos,strIPAddr,(void *&)pSocket);
if(pSocket)
{
//..........................
pSocket->m_bStopRead = true;
pSocket->ShutDown(2);
::WaitForSingleObject(pSocket->m_SockReadingEvent.m_hObject,2000);
pSocket->m_hSocket = INVALID_SOCKET;
::closesocket(pSocket->m_hSocket);
pSocket->Close();
delete pSocket;
pSocket = NULL;
}
}
//删除侦听socket
if(m_pLisener->m_hSocket != INVALID_SOCKET)
{
m_pLisener->ShutDown(2);
int nError = ::WSAGetLastError();
m_pLisener->m_hSocket = INVALID_SOCKET;
::closesocket(m_pLisener->m_hSocket);
m_pLisener->Close();
delete m_pLisener;
}
this->m_ClientInfoMap.RemoveAll();