网络通信部分放在了独立的线程中处理,因为使用的是CSocket,而且它是采用阻塞式的,所以需要自己使用多线程技术来接受数据,而不能再主线程中阻塞接收过程。
这是建立和搜索游戏的流程图:
建立游戏就是“摆擂”按钮:
void CWZQDlg::OnBnClickedServer()
{
if(m_receving)
return;
m_uid = 1;
AfxBeginThread(HostThread,this);
AfxBeginThread(ReceiveThread,this);
}
UINT CWZQDlg::HostThread(LPVOID param)
{
CWZQDlg* pwd = (CWZQDlg*)param;
MsgPack msp;
CString clientAddr;
UINT clientPort;
CSocket hostSock;//建立服务器,接收并回应UDP广播搜索的socket
hostSock.Create(pwd->m_SearchPort,SOCK_DGRAM);
pwd->SetWindowTextA("已建立服务器、等待用户");
hostSock.ReceiveFrom(&msp,sizeof(MsgPack),clientAddr,clientPort);
if(msp.type == SEARCH_HOST)
{
MsgPack hostMsg;
hostMsg.type = HOST_RESPONSE;
pwd->m_name.GetWindowTextA(hostMsg.data.SR.server,sizeof(hostMsg.data.SR.server)-1);
hostMsg.data.SR.uesrNum = 1;
Sleep(300);
hostSock.SendTo(&hostMsg,size