想多给分的,系统提示只能发表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);//接受客户机连接请求

}

解决方案 »

  1.   

    你看一下调试出错的时候,那个socket对象是否正确
      

  2.   

    我用F11调试进去的代码都看不懂的,F10就是到这一步
    ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET)出错。
    是不是说客户端socket没建立成功呢?但是我觉得建立成功了,
    主要就是accept的时候就出问题
      

  3.   

    Accept那里的断言:
    ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET)
    意思是说执行到这句的时候,m_hSocket == INVALID_SOCKET应该等于TRUE,现在这里报错,就是说m_hSocket应该是无效套接字句柄。看你意思是说,重玩的时候想重新建立连接是吧?服务端需要重新Accept,那这个m_clientSocket应该是个新的套接字。具体的我不太清楚,但是如果你是想重新连接的话,你也许应该先确认服务端正确的先断开连接,再用一个新的(或者重置为INVALID_SOCKET)的套接字重新连接。具体的你还得试试。