一:如何知道某个CSocket是否处于连接状态(我不是指实际的连接状态,实际的连接状态应该用心跳包,
我的意思是,我如何知道某个CSocket是否已调用过Close函数)
二:我在线程中调用Close函数出现断言错,程序如下:
//发送心跳包,由主线程激活
BYTE Data = 0;
POSITION pos, fpos;
while (1)
if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent, 0))
{
pos = pClientList->GetHeadPosition();
while (pos)
{
fpos = pos;
CComSocket* thisCComSocket = (CComSocket*) pClientList->GetNext(pos);
if (2 == thisCComSocket->LostPulseNum ||
SOCKET_ERROR == thisCComSocket->Send(&Data, 1)) //出错了
{
pClientList->RemoveAt(fpos);
thisCComSocket->Close(); //这里出错
delete thisCComSocket;
}
else
thisCComSocket->LostPulseNum++; //发送的心跳包个数加1,收到心跳包时减1
}
}错误为SOCKCORE.CPP文件的337行:
ASSERT(pState->m_hSocketWindow != NULL);
我的意思是,我如何知道某个CSocket是否已调用过Close函数)
二:我在线程中调用Close函数出现断言错,程序如下:
//发送心跳包,由主线程激活
BYTE Data = 0;
POSITION pos, fpos;
while (1)
if (WAIT_OBJECT_0 == WaitForSingleObject(hEvent, 0))
{
pos = pClientList->GetHeadPosition();
while (pos)
{
fpos = pos;
CComSocket* thisCComSocket = (CComSocket*) pClientList->GetNext(pos);
if (2 == thisCComSocket->LostPulseNum ||
SOCKET_ERROR == thisCComSocket->Send(&Data, 1)) //出错了
{
pClientList->RemoveAt(fpos);
thisCComSocket->Close(); //这里出错
delete thisCComSocket;
}
else
thisCComSocket->LostPulseNum++; //发送的心跳包个数加1,收到心跳包时减1
}
}错误为SOCKCORE.CPP文件的337行:
ASSERT(pState->m_hSocketWindow != NULL);
解决方案 »
- new了CList 之后的释放问题
- 编译器的问题?
- DLL中如何与调用进程通信
- 如何在datagrid中设置列数,我用的是vc6.0
- 请教高手:如何使用可执行文件的到处函数?
- 做了个软件A,打开com口后,进行接收com口数据测试,请问在VC++环境中如何获得和操作COM口。(读写 COM口的问题)
- MFC中怎么得到控件中的值
- 急!!!高分相送:可不可以用DirectSound控制声卡左右两个声道的输出。
- 我的第一个windows程序——hellomsg有问题请帮我看看!!!
- 找joke100
- 请问怎么在对话框中直接使用IWebBrowser2显示网页?
- [急]关于在dock win 中加入按钮的一个问题,谢谢
2.在Close之前加一句thisCComSocket->m_hSocket =INVALID_SOCKET,就能正常关闭,为什么会这样我也一直没搞清,好像由堆分配的CSocket对象直接调用Close时会出错,很奇怪的问题
另外
pClientList->RemoveAt(fpos);
thisCComSocket->Close(); //这里出错
delete thisCComSocket;
我不知道pClientList->RemoveAt(fpos);这个函数中做了些什么,不会在这个函数里就已经delete Csocket对象了吧
pClientList为一个CPtrList对象指针,不调用它的RemoveAt函数而直接Close也会出错。