我想,1。你把CSocket放在函数中在栈上建立,会不会把Handle传给线程了,但是函数结束后,那个Handle又无效了呢,试着在堆上建立看看
2。我觉得不应该在InitInstance上把这个Handle Attach上去,虽然你的线程是Suspend方式建立的,可是我查了一下msdn也不知道建立线程的时候,InitInstance是不是先执行了的。所以,最安全的办法还是发消息给线程的消息循环,然后再在消息中把Socket的Handle传递过去一点浅见,不知道对不对,请指正

解决方案 »

  1.   

    时序的问题吧。应在beginthread前就有sk了
    而且最好不要用MFC那些破类,尤其在多线程方面,SDK编出来反而简洁容易调试。
    甚至我觉得CSOCKET也不如直接用SDK简单。
      

  2.   

    to lenyu 你说的几种解决方法都是我最早时试的,行不通最后才变成现在这样。
    to lgs请说明问题是什么。cc是td的成员变量类型为CSocket派生的类
    在debug模式下运行一点问题也没有
      

  3.   

    wait如果真的没人知道为什么我只好改用SDK了,不过这一来又要重写,唉
      

  4.   

    我也写过相似的代码,用消息中的参数来传递SOCKET句柄,不过跟你相反的是,我写的代码在DEBUG下出现ASSERT错误,在RELEASE下一切正常。
      

  5.   


    不要将SOCKET的HANDLE进行传递
    我试过如果传递很容易在RELEASE方式下出错(特别是在线程中)
      

  6.   

    CSocket有它自己的窗口类.如果你把CSocket的指针传递到另一个线程会出现问题.建议传递
    HANDLE.
      

  7.   

    我以前经常在线程之间传递socket句柄,没有问题的。应该也不存在堆栈分配内存的问题。
      

  8.   

    to sunlet:
    我源程序都贴出来了。你说没问题就帮我解决呀。把你的解决方法贴出来好吗?
      

  9.   

    to lhxx:
    你知道是在哪几种情况下出错吗?研究研究
      

  10.   

    应该先accept(),再AfxBeginThread();
    调用AfxBeginThread(),和CreateThread()都会立马运行InitInstance()函数
    应该传socket的句柄,而不是指针.传指针的话,在多线程且并发度较高的情况下,会出问题的.
      

  11.   

    不会的,可以在InitInstance里加MessageBox来确认有没有运行。
    而且,各位,在Debug下运行无误
      

  12.   

    你如果加个AfxMessageBox(),子线程还在等你点OK,母线程在后面照跑不误
      

  13.   

    本人也碰到过这个问题,能想的招全试了,就是不行。后该为直接用winsockAPI编程,
    一切都OK了。本人觉得CSocket、CAsyncSocket在多线程时有点问题,在单线程下没有
    这些问题,也不想去研究,反正现在是不用这两个类了,直接用API,编程又简洁,控制
    又直接。
      

  14.   

    我的没有出现你们提的问题啊,我看一下,我是怎么搞的(从MSDN中的例子中copy过来的)。
      

  15.   

    我看我的程序和上面差不多啊!!!可在我这里没有问题啊,我把他贴出来吧:
    void CVideoSvrDoc::ProcessPendingAccept()
    {
       CMainFrame * pMainWnd;
       pMainWnd=(CMainFrame *)::AfxGetMainWnd(); CClientSocket Socket(this);
    if (pMainWnd->m_pSocket->Accept(Socket))
    {
          CString PeerAdd;
          UINT PeerPort;
          Socket.GetPeerName(PeerAdd,PeerPort);
          CString strTmp;
          strTmp.Format("有客户端连接,已建立连接,地址:"+PeerAdd+"端口:%d",PeerPort);
          WriteToLog(strTmp,SERVERLOGTYPE);
    #ifdef _DEBUG
          OutMsg(strTmp);
          OutMsg("套接字为:%d",Socket.m_hSocket);
    #endif
    }
    else
       {
    //delete pSocket;
          WriteToLog("接受连接出错",ERRORLOGTYPE);
          return;
       } CConnectThread* pThread = (CConnectThread*)AfxBeginThread(RUNTIME_CLASS(CConnectThread), THREAD_PRIORITY_NORMAL, 0, CREATE_SUSPENDED);
    if (!pThread)
    {
    Socket.Close();
    TRACE("Could not create thread\n");
    return;
    } pThread->m_hSocket =Socket.Detach();
       pThread->m_pDoc=this; pThread->ResumeThread();
    }在CConnectThread中定义了下面几个变量:
    public:
    SOCKET m_hSocket;

    CClientSocket * m_pSocket;// Operations
    public:
    CSvrDoc * m_pDoc;//
    BOOL CConnectThread::InitInstance()
    {
    //::PostMessage(AfxGetApp()->m_pMainWnd->m_hWnd, WM_THREADSTART, 0,0);
       m_pSocket=new CClientSocket(m_pDoc);
    m_pSocket->Attach(m_hSocket);
    m_pSocket->m_pThread = this;
       CreateSocketInformation(m_pSocket);//建立有关该连接的一些信息
    return TRUE;
    }
      

  16.   

    你可以先参考下CAsyncSocket的源码( sockcore.cpp ),其实也很简单的
    然后再自己根据需要用API写,控制起来直接方便好多.
      

  17.   

    请问你现在解决了吗,我也遇到了,请MAIL:[email protected]
      

  18.   

    我已经知道问题了,竟然是因为用了静态链接!
    I am use MFC in STATIC library!
    改成动态的就正常了,同志,这就是微软。