我用 CSocket 做了个服务端,在ACCEPT事件中这样写的:        if (!SvrSocket.Accept(socket2))
{
AfxMessageBox("连接失败");
}
else
{
AfxMessageBox("连接成功");
SOCKET  h=socket2.Detach();                  //创建一个线程与客户端通信 CWinThread* MyThread=AfxBeginThread(ThreadFunc,(LPVOID)h,THREAD_PRIORITY_NORMAL,0,0);
}
在线程中这样写的: while (1)
{
threadsocket.Receive(msg,255); //接收
AfxMessageBox(msg);
}
请问,我要向客户端发送消息该怎么办呢?线程中threadsocket.Receive(msg,255); 应该是阻塞状态,一直在等待吧?

解决方案 »

  1.   

    socket通信是全双工的,可在其他线程进行数据发送的工作
      

  2.   

    谢谢,问题解决了,这样写的代码:ReceiveThread[ThreadID]=AfxBeginThread(ThreadFunc,(LPVOID)h,THREAD_PRIORITY_NORMAL,0,0);
    //用于发送消息的线程
    SendThread[ThreadID]=AfxBeginThread(Threadsend,(LPVOID)h,THREAD_PRIORITY_NORMAL,0,0);但这样写有一个新问题,但发送消息的线程 Threadsend 结束后,好像就和客户端断开连接了,而断开连接后,接收线程还不断弹出消息,明明都断开了它怎么还能收到消息啊?: while (1)//这里有没有一个状态什么的判断客户端已断开呢?
    {
    threadsocket.Receive(msg,255);
    AfxMessageBox(msg);
    }
      

  3.   

    不会断的,有没CloseHandle,能接收到消息是正常的。
      

  4.   

    感谢Funniest兄,但现在还有问题,请帮我再看看。问题一:不知道客户端是否断开,我是这样写的,但这种方法不好:datasize=threadsocket.Receive(msg,255); 
    if (datasize>0) //关闭客户端后,datasize不断收到消息,长度为0,所以小于等于0就表示断开了(我         //是这样想的
    {
    AfxMessageBox(msg);
    }
    else
    {
    CWinThread* KillThread=ReceiveThread[myid];TerminateThread(SendThread[myid]->m_hThread , 0); //结束发送消息线程
    ReceiveThread[myid]=NULL;
    SendThread[myid]=NULL;
    TerminateThread(KillThread->m_hThread , 0);//结束当前线程

    }
    问题二、发送线程不能退出,退出后接收线程就和客户端断开了。但发送线程挂起后会出错:SendThread[myid]->SuspendThread();//执行挂起时出现错误(调试状态,正常状态是内存不能为read)
    //错误信息:Unhandled exception in Server.exe (MFC42D.DLL):0x0000005: Access violation
    主要是问题二,请帮我仔细看看吧,谢谢。
      

  5.   

    TerminateThread啥的很少用的,可以看看《windows核心编程》,线程如何启动、终止都有很好的例子。