我在主线程里面建立了socket连接。
在某一个页码里面加入了接收函数。如果不打开这个页码在主线程的析构函数里面closesocket(theApp.m_Socket[1].socketTmp);
发现不管用。开了这个页面才行,是什么原因?DWORD WINAPI COutList::thread(LPVOID lpParameter)
{
HWND  hwnd = ((RECVPARAM*)lpParameter)->hwnd;
COutList* pdlg = ((RECVPARAM*)lpParameter)->pdlg;
int s = 1;
char buff[100];
while(s != SOCKET_ERROR)
{
//调用recv函数接收数据
s = recv(theApp.m_Socket[1].socketTmp,buff,100,0);
if (s != SOCKET_ERROR )
{
pdlg->Parse_Code(buff,1);
}
}
//发送断开命令
//send(theApp.m_Socket[1].socketTmp,"连接断开",100,0);
//closesocket(theApp.m_Socket[1].socketTmp);
delete lpParameter;   //释放
return NULL;
}

解决方案 »

  1.   


    主线程的析构函数 是指应用程序退出吗?
    应用程序退出会自动closesocket,加不加意义不大,发现不管用。是什么意思?是指对方收不到FD_Close吗?如果这样考虑加心跳包试试我也没遇过LZ说的问题,以上是我的猜测,听楼下详解...
      

  2.   

    在closesocket上面设置断点,看看socket的值是不是变了。
      

  3.   

    DWORD WINAPI COutList::thread(LPVOID lpParameter)
    ??
    这样在类内定义线程?
      

  4.   

    你建立的是基于窗口的socket,所以只有在打开窗口才行,不知道我理解的对不对
      

  5.   

    在线程里面不要调用 类的成员函数。。
    否则会出现不知名的错误。、、
    推荐使用postmessage函数来邮寄消息到指定窗口
      

  6.   

    你是做的c++吗?我怎么就看不懂了,奇了怪了。
    1.不明白你为什么取hwnd的值,整篇没看见你用。
    2.为什么你在线程退出时把窗口也析构了。如果你在这里析构窗口,那么与窗口有关的变量都被析构了。而我们开线程一般是不析构窗口的,除非这就是你的主线程,在说了,MFC里面你是看不到主窗口线程代码的。越想越迷糊。
    3.总之你的程序很乱,编程要力求简洁2字。不该出现的代码就不要写。