一:如何知道某个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);

解决方案 »

  1.   

    MFC的csocket类需要一个不可见窗口分发消息,这是MFC初始化的时候完成的,你可以看看这个m_hSocketWindow 是否正确创建或在什么地方被close了
      

  2.   

    1.调用过Close的函数的CSocket的句柄m_hSocket会等于INVALID_SOCKET,
    2.在Close之前加一句thisCComSocket->m_hSocket =INVALID_SOCKET,就能正常关闭,为什么会这样我也一直没搞清,好像由堆分配的CSocket对象直接调用Close时会出错,很奇怪的问题
    另外
    pClientList->RemoveAt(fpos);
    thisCComSocket->Close(); //这里出错
    delete thisCComSocket;
    我不知道pClientList->RemoveAt(fpos);这个函数中做了些什么,不会在这个函数里就已经delete Csocket对象了吧
      

  3.   

    套节字是一定创建成功了的,因为我用它发过数据的。
    pClientList为一个CPtrList对象指针,不调用它的RemoveAt函数而直接Close也会出错。
      

  4.   

    我把上面的代码放到主线程(带窗口,对话框程序,也就是创建CSocket的线程)中,执行一点问题都没有。
      

  5.   

    我也遇到过类似的问题,你在函数之间传递socket参数时,形参最好用引用形式,不要用传值的形式。
      

  6.   

    我把上面的代码放到主线程(带窗口,对话框程序,也就是创建CSocket的线程)中,执行一点问题都没有。///////////////////////////////////////////////////////////////////CSocket 是需要有窗口支持的