求救高手!关于套接字CAsyncSocket的问题
想多给分的,系统提示只能发表50分以内的帖子。。请大家见谅!
本人初学MFC,模仿例子写了个五子棋游戏(应该是单线程),使用CAsyncSocket进行通信。
游戏可以正常连接成功,可以玩了(自己和自己下),我想加哥重新开始游戏的功能,于是
我这样做的:客户端点击重新开始游戏,此时会发送消息给主机,主机收到重玩请求,同意
重玩,并发送消息给客户机,然后关闭主机套接字serverSocket,重新开始游戏,客户机收到
同意消息后也关闭客户据套接字clientSocket,然后重新开始游戏。最后出现debug assert错误
sockcore.cpp第183行:ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET);调试了
好几天了,还没找到问题出在哪,求高手解决!
关键代码如下:
//重新开始void CFiveChessDlg::OnRestart(){ // TODO: 在此添加命令处理程序代码 //客户机请求重玩 m_isReConnect = TRUE; if(1 == m_setupDialog.m_isHost) { CMsg msgSend; msgSend.msgType = RESTART_REQUEST; this->SendMsg(&msgSend); }}//接收消息函数void CFiveChessDlg::RecvMsg(){ CMsg msgRecv; m_clientSocket.Receive(&msgRecv,sizeof(CMsg));//接收消息到msgRecv switch(msgRecv.msgType) { //落子消息 case PUSHDOWN: m_board.m_flagWait = FALSE;//等待标志设为False m_board.ShowChess(msgRecv.x,msgRecv.y,msgRecv.color);//显示棋子 m_board.AfterPush(msgRecv);//落子后处理 break; //客户机请求重玩消息 case RESTART_REQUEST: if(IDYES == AfxMessageBox(_T("客户机请求重玩,同意吗?"),MB_YESNO | MB_ICONQUESTION)) { m_isReConnect = true;//重玩标志 CMsg msgSend; //向客户机发送同意消息 msgSend.msgType = RESTART_AGREE; this->SendMsg(&msgSend); RestartGame(); //重玩游戏 } break; //主机同意重玩消息 case RESTART_AGREE: AfxMessageBox(_T("主机同意了你的请求重玩,现在可以重新开始游戏了!")); m_CreateCount_Client = 0; m_clientSocket.Close(); NewGameStart(); break; //this->ExecuteRestart(); }}//启动游戏void CFiveChessDlg::NewGameStart(){ if(0 == m_setupDialog.m_isHost)//当前是主机 { if(0 == m_CreateCount_Server) { m_serverSocket.Create(atoi(m_setupDialog.m_port));//建立socket对象 m_serverSocket.Listen();//监听端口 m_CreateCount_Server++; } else { AfxMessageBox(_T("已经存在一个主机了!")); } } else if(1 == m_setupDialog.m_isHost)//当前是客户机 { if(0 == m_CreateCount_Client) { m_clientSocket.Create();//建立socket对象 m_clientSocket.Connect(m_setupDialog.m_hostIpStr,atoi(m_setupDialog.m_port));//建立连接 m_CreateCount_Client++; } else { AfxMessageBox(_T("已经存在一个客户机了!")); } }}//接受连接void CFiveChessDlg::Accept(){ m_serverSocket.Accept(m_clientSocket);//接受客户机连接请求 }