请教这样一个问题:在开发诸如联众网络游戏时,需要从服务器上取得游戏列表和房间列表,以完成客户端的游戏列表和房间列表的显示,假设在初始化游戏列表时向服务器发送请求,然后等待服务器的回音以决定接下来的动作(得到正确数据正常显示,如超时则作相应处理),如何实现该功能??
现在我采取的方式:
CMySocket
CMySocket::sendpackage(CPackage &cPack)
{
...
}CMySocket::OnReceive(int nNum)
{
..
  switch(message)
  {
    case: 请求游戏列表的消息的回音:
        //send data to ListCtrl
        break;
    ....
  }
  ...
}CData:
CData::GetGameData(CArray<xxx, xxx> &lstGame, DWORD dwSomething)
{
  CMySocket cs;
  CPackage cPack;
  (填充Packge数据)
  cs.sendpackage(cPack) -->向服务器请求游戏和房间列表
  //Notice: 希望在这里等待,得到服务器的数据
  ....
}Begin InitialList
  ....
  CData maindata;
  maindata.GetGameData(....) //取得服务器数据,第一个参数中返回结果
    ...
End InitialList  
  有什么好办法吗??或者谁又跟好的实现机制??谢谢。

解决方案 »

  1.   

    可以直接设置发送或者接收超时:
    int rcvtime=1000;(1秒)
    setsockopt(socket,SOL_S0CKET,SO_SNDTIMEO,(char *)&rcvtime,sizeof(rcvtime));
    setsockopt(socket,SOL_S0CKET,SO_RCVTIMEO,(char *)&rcvtime,sizeof(rcvtime));
      

  2.   

    To yhqs540(普通话,语言中的战斗机):
      你指的是Client端的阻赛??我要的就是这个效果:-)大家还有什么好建议吗??
      

  3.   

    不必须等待时尽量不要让Client等待,以免锁住界面。等到Server端数据到来时再处理。
      

  4.   

    有时候必须这样啊,比如进入某一房间,首先向服务器申请,如果这个房间没有满的话则可以加入,如果人满或网络问题则给出相应消息,这时的Client应该等待吧?!再比如加入某张桌子进行游戏,也得和服务器交互阿,因为可能有两个人几乎同时选择这个座位。不知道那些游戏是怎么实现的??有人做过这方面的东西吗??还望赐教。
      

  5.   

    int nCount = 0;
    while(没得到完整数据)
    {
      nCount++;
      if(nCount > 1000)
      {
        break;
      }
      Sleep(10);
    }
      

  6.   

    To wwwsq(wwwsq):
    程序使用Sleep函数时,我的网络处理类能进行数据的接收处理吗??或者应该这么说:在While循环中调用Sleep时,程序是Hold在Sleep那个点上,还是可以处理别的东西,比如说这时服务器有数据到来,他也能进行接收工作??
      

  7.   

    我不知道你的CData::GetGameData()函数是在哪里调用的。如果是在消息响应函数里面调用,那我上面的代码就不能这么简单的block了,那样会block线程的MessageQueue。如果CData::GetGameData()和你的通讯socket不在一个线程调用,那上面的简单block就可以用。
      

  8.   

    如果是这样的话,那么OnReceive()的时候,如果发现数据来不及处理,就什么也不要做,直接return。然后,当程序有能力处理数据的时候,再执行Receive()操作。
      

  9.   

    To wwwsq(wwwsq):
    谢谢您的热心帮助和参与,但我想您的方法不是我所要的...其他人还有办法吗??