就是要用ATTACH和DETACH的原因。因为线程传递CASYNCSOCKET不安全。传递SOCKET 就可以了。以前我也有类似的错误。是一个牛B人告诉我的。    SOCKET *S;
    S=new SOCKET;
    *S=xxx.DETACH();
    ::AfxBeginThread(...,(LPVOID)S);
///....
线程里
   XXX XX;
   XX。ATTACH(*S);
   DELETE S;
 

解决方案 »

  1.   


    不如把代码贴出来说不定能骗点分。
    其实用MFC你根本不用CLOSE。类早帮你高定了
    void CSERVERView::ONACCEPT()
    {
       //::AfxMessageBox("ASDFAS");
       CAsyncSocket client;
       CSERVERApp * app=(CSERVERApp *)::AfxGetApp();
       app->listen.Accept(client);
       SOCKET *S=new SOCKET;
       *S=client.Detach();
       ::AfxBeginThread(NewClient,(LPVOID)S);
       app->listen.AsyncSelect(FD_ACCEPT);

    }
    UINT NewClient(LPVOID P)
    {
       CSERVERApp * app=(CSERVERApp *)::AfxGetApp();
       SOCKET *S=(SOCKET*)P;
       CAsyncSocket client;
       client.Attach(*S);
       delete S;
    //。/* MM你好吗?
      好啊。咱们结束通行吧
    */
    }
      

  2.   

    在MSDN中搜索标题"Illustrates Using Sockets in Multiple Threads",又比较详细的说明。
      

  3.   

    只是一个同步问题,用临界区就可解决。
    线程里用:
      进入临界区;
      发送数据;
      退出临界区;OnClose函数:
      进入临界区
      关闭socket
      退出临界区