本帖最后由 VisualEleven 于 2013-03-18 17:51:45 编辑

解决方案 »

  1.   

    楼主:
    1、你这么长篇大论最好用一下代码那个功能,要不真没法看;
    2、AfxSocketInit 一个程序用一次就行;
    3、两个解决方法,一个是准备一个event,在线程退出后signal,stop里一直等到这个event再返回,保证每次都安全退出;二是修改线程为线程池,新建时候如果有可用的就不真的新建。
      

  2.   

    1 最稳妥的结束方式,是让线程函数自己返回。2 AfxSocketInit你调用了多少次?这个函数应该是封装了WSAStartup,一个应用程序只需要启动时调用一次就行。3 内存泄漏其实并不难检测,试试DebugDiag;http://blogs.msdn.com/b/tess/archive/2010/01/14/debugging-native-memory-leaks-with-debug-diag-1-1.aspx
      

  3.   

    我知道最理想的方式还是函数自己返回,但是在while(1)中,比如:
    while(1)
    {
        if(m_flag)
       {
           socket.send(txbuf,3);
           socket.recevie(rxbuf,255);
       }
       else
       {
          return 0;
       }
    }
    要让函数返回,只需要设置m_flag等于false就可以,但是如果socket阻塞在接收的时候,这个时候设置m_flag也是没有用的,一定要等recevie返回后,才能跳出while(1).
      

  4.   


    1 阻塞模式(你正在用的): 设置send、receive的timeout;
    2 非阻塞模式: 用select,select里设置timeout;
      

  5.   


    设置socket的SO_SNDTIMEO, SO_RCVTIMEO 
    http://msdn.microsoft.com/en-us/library/windows/desktop/ms740532%28v=vs.85%29.aspx
      

  6.   

    你创建一个线程,不需要频繁的销毁创建吧。给线程发送消息PostThreadMessage(),线程函数根据消息的不同做不同的逻辑处理即可。真正需要销毁线程的时候也可以发送消息到线程,线程接收到消息以后return返回
      

  7.   

    SetSockOpt不能设置SO_SNDTIMEO, SO_RCVTIMEO ,设置超时,只能设置SOCKET对象,不能设置CSocket对象:
    Berkeley Software Distribution (BSD) options not supported for SetSockOpt are:Value Type Meaning 
    SO_ACCEPTCONN BOOL Socket is listening 
    SO_ERROR int Get error status and clear. 
    SO_RCVLOWAT int Receive low water . 
    SO_RCVTIMEO int Receive timeout 
    SO_SNDLOWAT int Send low water . 
    SO_SNDTIMEO int Send timeout. 
      

  8.   

    其实不用频繁创建的,能挂起再恢复也可以,现在是因为socket阻塞了线程,导致线程也不能响应消息的~要让线程停止下来,只有使用结束线程才能停止。
      

  9.   

    我马上也和楼主一样面临这个问题了,先一下另外 ,我准备使用PostThreadMessage(thread->m_nThreadID , WM_QUIT , 0 , 0);看能否从阻塞中退出,暂时还没有测试