这个程序是先用控件按钮来创建一个CSocket然后调用线程接收数据,在线程中再调用线程来保持不停地监听状态,程序如下:
void COverlayDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
        socketSend.Create(6802,SOCK_STREAM,"192.168.0.18");
socketSend.Bind(6801,"192.168.0.18");
socketSend.Listen(5); 
AfxBeginThread(TreadBegSocket,GetSafeHwnd());
}
UINT TreadBegSocket(void *pParam)
{    
     socketSend.Accept(asyncSend);
     socketSend.Close();
     AfxBeginThread(TreadBegSocket,pParam);
     return 0;
}但是这样的话运到socketSend.Accept(asyncSend);就会出错,而编译是没有问题的。我把程序改成这样:
void COverlayDlg::OnBnClickedButton4()
{
// TODO: 在此添加控件通知处理程序代码
AfxBeginThread(TreadBegSocket,GetSafeHwnd());
}
UINT TreadBegSocket(void *pParam)
{    
     socketSend.Create(6802,SOCK_STREAM,"192.168.0.18");
     socketSend.Bind(6801,"192.168.0.18");
     socketSend.Listen(5); 
     socketSend.Accept(asyncSend);
     socketSend.Close();
     AfxBeginThread(TreadBegSocket,pParam);
     return 0;
}这样开始的错误不会出现,但是显然会出现新的错误,因为socketSend.Create(6802,SOCK_STREAM,"192.168.0.18");把 AfxBeginThread(TreadBegSocket,pParam);
去掉就不会有错,但是又不能实现不断监听的作用,大家来帮我看一下是什么原因。

解决方案 »

  1.   

    TreadBegSocket没有消息队列,所以不能响应任何SOCKET消息。应该设计一个CWinThread线程。
      

  2.   

    如果需要多线程,最好不要使用 CSocket ,直接使用 WinSocket 更好。
      

  3.   

    对,用多线程最好不要用CSOCKET,直接用api
      

  4.   

    socket句柄不能跨线程传递,如果要传递的话,设一个socket全局变量g_socket,将主线程调用Detach()付给他,在另开的线程中Attach(g_socket)
    就可以了
      

  5.   

    你最好在多线程中直接使用 WinSocket API。
      

  6.   

    关键是你的对Socket的调用整体思路不清晰,
    建议多看看有关Socket机理的文章。
    msdn或网上的。
    解了燃眉之急,但不能根除。
      

  7.   

    为什么你要这么用CSocket? CSocket不该这么用呀
      

  8.   

    socketListen.Create(6802,SOCK_STREAM,"192.168.0.18");
        socketListen.Bind(6801,"192.168.0.18");
        socketListen.Listen(5); 
    -------------------------------------------
    ...
    CListenSocket::OnAccept(int nErrorCode) 
    {
        ...
        serverSocket.Accept(socketListen)
        ...
    }
    -------------------------------------------
        ....
        serverSocket.send();...
        ....
    -------------------------------------------
    CServerSocket::OnReceive(int nErrorCode) 
    {
        ...
    }
      

  9.   

    你的CSocket用法有些怪,在其中根本不用Bind()这个函数就可以建立连接,connect()做了许多工作