首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

求救高手!关于套接字CAsyncSocket的有关问题

2012-01-14 
求救高手!关于套接字CAsyncSocket的问题想多给分的,系统提示只能发表50分以内的帖子。。请大家见谅!本人初学

求救高手!关于套接字CAsyncSocket的问题
想多给分的,系统提示只能发表50分以内的帖子。。请大家见谅!
本人初学MFC,模仿例子写了个五子棋游戏(应该是单线程),使用CAsyncSocket进行通信。
游戏可以正常连接成功,可以玩了(自己和自己下),我想加哥重新开始游戏的功能,于是
我这样做的:客户端点击重新开始游戏,此时会发送消息给主机,主机收到重玩请求,同意
重玩,并发送消息给客户机,然后关闭主机套接字serverSocket,重新开始游戏,客户机收到
同意消息后也关闭客户据套接字clientSocket,然后重新开始游戏。最后出现debug assert错误
sockcore.cpp第183行:ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET);调试了
好几天了,还没找到问题出在哪,求高手解决!
关键代码如下:

C/C++ code
//重新开始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);//接受客户机连接请求    }


[解决办法]
设置断点,单步调试一下.
[解决办法]
Accept那里的断言:
ASSERT(rConnectedSocket.m_hSocket == INVALID_SOCKET)
意思是说执行到这句的时候,m_hSocket == INVALID_SOCKET应该等于TRUE,现在这里报错,就是说m_hSocket应该是无效套接字句柄。

看你意思是说,重玩的时候想重新建立连接是吧?服务端需要重新Accept,那这个m_clientSocket应该是个新的套接字。具体的我不太清楚,但是如果你是想重新连接的话,你也许应该先确认服务端正确的先断开连接,再用一个新的(或者重置为INVALID_SOCKET)的套接字重新连接。

具体的你还得试试。

热点排行