我用单线程执行,同样的程序,没有问题。
程序如下:
void COrderServerDlg::OnFileServer() 
{
   。
   
   g_cListen->Create();
   g_cListen->Listen();
   //the up two lines are both success and g_cListen is a global socket
   CWinThread* pThread = AfxBeginThread(ServerThreadProc, GetSafeHwnd(), THREAD_PRIORITY_NORMAL);
}
UINT ServerThreadProc(LPVOID pParam)
//it is global function 
{.....
      ntmpA = g_sListen->Accept(clientSocket,saClient,&nTmp);
  ....
}

解决方案 »

  1.   

    AfxBeginThead(ServerThreadProc, this, 0) ;
    COrderServerDlg* ldlg = (COrderServerDlg*)pParam ;
    ldlg->g_cListen->(...) ;
      

  2.   

    难道这里仅是聊天的地方吗?GetSafeHwnd()的返回值非NULL,it is normal!
      

  3.   

    你说的是在ServerThreadProc中吗?另外,g_cListen是全局的,能不能详细点,我不明白。
    谢谢!
      

  4.   

    传递句柄,不要传递对象。很多MFC类都不是线程安全的,例如:CWnd及其派生类。
      

  5.   

    who can help me ! me ? My god?
      

  6.   

    我对socket API,CSocket,使用多线程等网络编程技术很熟,跟我联系,定能解决问题。
    我的QQ12953091.
      

  7.   

    我很久不用QQ了,可以告诉我你的MAIL吗?或在莫个聊天室,谢谢您了。
      

  8.   

    是不是主窗口已经销毁了,而你的线程还在运行的时候报的异常呢?
    因为在CSOCKET创建时,已经与主窗口发生了关联(可看看MFC的源文件),如果主窗口已经销毁了,而ACCEPT函数还在检查主窗口是不是有效。
      

  9.   

    因为MFC中的CSocket使用的是Select模型,因此他是当Socket的Accept事件发生以后,需要一个窗口来接受WM_SOCKET事件.而且我建议你把Accept函数放到Thread以外,利用Accept函数返回的Socket放到Thread中.
      

  10.   

    pState 是局部变量,换个全局的试试~
      

  11.   

    pleasure(杨易)的方法可以试一试
      

  12.   

    错误的原因在于:您新的线程是一个工作线程,而不是一个用户线程.用户线程会有一个接收消息的窗口,而在工作线程中就没有了.在CSocket中,如果出现阻塞之类的时候(参看CSocket::Accept之类的函数实现),就会发送消息给本线程,但是工作线程没有窗口,从而没有消息队列,所以会出现ASSERT(pState->m_hSocketWindow != NULL)异常.而如果您使用单线程,自然也就不会出错了.
    解决方法是:
    1.创建用户线程,而非工作线程;
    2.不使用CSocket类,而是自己使用Socket编程来实现.
      

  13.   

    zxi666(谁用了我的昵称) 
    说得很对呀!
    你去看看《高级Windows编程》关于多线程方面的知识,里面阐述的比较清楚
      

  14.   

    我同意zxi666(谁用了我的昵称)的意见,winsock并不是线程安全的,
    它在内部实现了一个窗体,但是工作者线程没有什么窗体可言,所以
    ASSERT就错了。作为替代,你可以在线程外生成Socket,将其hSocket
    传递到线程中。