我用 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); 应该是阻塞状态,一直在等待吧?
{
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); 应该是阻塞状态,一直在等待吧?
//用于发送消息的线程
SendThread[ThreadID]=AfxBeginThread(Threadsend,(LPVOID)h,THREAD_PRIORITY_NORMAL,0,0);但这样写有一个新问题,但发送消息的线程 Threadsend 结束后,好像就和客户端断开连接了,而断开连接后,接收线程还不断弹出消息,明明都断开了它怎么还能收到消息啊?: while (1)//这里有没有一个状态什么的判断客户端已断开呢?
{
threadsocket.Receive(msg,255);
AfxMessageBox(msg);
}
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
主要是问题二,请帮我仔细看看吧,谢谢。