在主进程中的异步监听SOCKET(CAsyncSocket m_MainAsyncS)在监听到请求后,建立处理子线程(CWinThread m_SubThread), 并将子线程中的一个成员变量:阻塞SOCKET(CSocket SubSocket)直接作为Accept的参数(m_MainAsyncS.Accept(m_SubThread->SubSocket)), 在DEBUG中, 激活子线程后该阻塞SOCKET可以发送数据(m_SubThread.Send(sBuffer,sizeof(sBuffer))),但无法做阻塞接收(m_SubThread.Recive(rBuffer,sizeof(rBuffer),0)),如果在同一线程中(如都在主线程中)就不存在这样的问题,在DEBUG中给出的错误提示是:"File sockcore.cpp Line:850"编译(DEBUG模式)后给出的错误提示是:"File sockcore.cpp Line:336".

解决方案 »

  1.   

    首先是不应该在父进程中操作线程成员,因为WINDOWS的多任务特性使得线程之间独立运行,但是它们彼此共享虚拟空间。所以线程有可能会同时操作一片内存,类对象也是一片内存区域,这时会产生意外问题。如果要共同操作一个大尺寸变量你必须做好线程的同步。
        你可以如下做试试:
        CSocket *m_SubSocket;
        m_SubSOcket=new CSocket;
        MainSocket->Accetp(*m_SubSocket);
        把m_SubSocket做为参数,在子线程启动时传递
        AfxBeginThread(SubThread,(LPVOID)m_SubSocket)
        也可以把套接口描述符作为参数。
        还有要注意的是阻塞的socket调用必须考虑客户端的收发,如果客户端正处与接收阻塞,服务端也就没法接收了,而且线程的结束也很危险。