KBEngine官方论坛

 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 配置 开服
查看: 1368|回复: 1

客户端等待连接操作(C++的客户端插件二)

[复制链接]

41

主题

94

帖子

719

积分

高级会员

Rank: 4

积分
719
发表于 2015-10-30 13:44:42 | 显示全部楼层 |阅读模式
本帖最后由 bbydt 于 2015-10-30 13:44 编辑

客户端登录出来的接收死循环实现方式,在构造net_client 的时候,会绑定回调函数,这里用到了Coco的函数啊,以后有空要改,不然怎么能平台无关呢?!
  1. NetClient::NetClient()
  2. {
  3.         if (!InitSocketSystem())
  4.         {
  5.                 printf("Failed to retrive socket version.\n");
  6.                 return;
  7.         }
  8.         sock = new BaseSock();
  9.         sock->Create(false);
  10.         isConnect = false;
  11.         messageLengthLenC2S = 2;
  12.         messageOpcodeLenC2S = 2;
  13.         messageLengthLenS2C = 2;
  14.         messageOpcodeLenS2C = 2;
  15.         CCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(NetClient::tick), this, 0, false);
  16. }
复制代码
下面是tick回调函数的实现,根据里面 msgid 进行switch case编写,跳到不同的函数中去!
  1. void NetClient::tick(float dt)
  2. {
  3.         if (sock && isConnect)
  4.         {
  5.                 char buf[RECV_LEN];
  6.                 memset(buf, 0, RECV_LEN);
  7.                
  8.                 //select(sock, mode.???
  9.                
  10.                 int len = sock->Recv(buf,RECV_LEN);
  11.                 if (len <= 0)
  12.                 {
  13. #if (CC_TARGET_PLATFORM == CC_PLATFORM_WIN32)
  14.                         bool ret = false;  
  15.                         HANDLE closeEvent = WSACreateEvent();  
  16.                         WSAEventSelect(sock->m_sock, closeEvent, FD_CLOSE);  

  17.                         DWORD dwRet = WaitForSingleObject(closeEvent, 0);  

  18.                         if(dwRet == WSA_WAIT_EVENT_0)  
  19.                                 ret = true;  
  20.                         else if(dwRet == WSA_WAIT_TIMEOUT)  
  21.                                 ret = false;  
  22.                         WSACloseEvent(closeEvent);

  23.                         if (ret)//断开连接了
  24.                         {
  25.                                 close();
  26.                                 noticeSocketDisconnect(len, (int)dwRet);
  27.                         }
  28. #else
  29.                         int sockErr = errno;
  30.                         if (len == -1 && EWOULDBLOCK == sockErr)//还是正常的
  31.                         {
  32.                         }
  33.                         else//断开连接了
  34.                         {
  35.                                 close();
  36.                                 noticeSocketDisconnect(len, sockErr);
  37.                         }
  38. #endif
  39.                 }
  40.                 else
  41.                 {
  42.                         CCLOG("got data size=%d",len);
  43.                         stream.append(buf,len);

  44.                         while(stream.opsize())
  45.                         {
  46.                                
  47.                                 uint16 msgid;
  48.                                 uint16 msglen;
  49.                                        
  50.                                 //check head full head?
  51.                                 if ( stream.opsize() >= 4)
  52.                                 {
  53.                                         stream>>msgid;
  54.                                         stream>>msglen;
  55.                                 }
  56.                                 else
  57.                                 {
  58.                                         //only when disconnect from loginapp call here.
  59.                                         stream.clear(true);
  60.                                         CCLOG(" stream clear opsize = %d", stream.opsize() );
  61.                                         break;                               
  62.                                 }

  63.                                 //check body.
  64.                                 if ( stream.opsize() < msglen-4)
  65.                                 {
  66.                                         size_t pos = stream.rpos();
  67.                                         stream.rpos(pos-4);
  68.                                         stream.clear(true);
  69.                                         CCLOG(" stream opsize =  %d", stream.opsize() );
  70.                                         break;
  71.                                 }
  72.                                 CCLOG("msgid=%d msglen=%d", msgid, msglen);

  73.                                 // add by: macrogu
  74.                                 if (msgid == 523)                        // 引擎版本不匹配
  75.                                 {
  76.                                         KBEngineClient::ClientApp::getInstance().onVersionNotMatch(stream);
  77.                                 }
  78.                 }
  79.         }
  80. }
复制代码
根据接收到的 msgid 到不同的消息处理函数中去!
回复

使用道具 举报

8

主题

3374

帖子

7586

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
7586
QQ
发表于 2015-10-30 15:25:40 | 显示全部楼层
:victory:
柯标
3603661@qq.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|KBEngine Forum

GMT+8, 2018-12-11 17:52 , Processed in 0.028903 second(s), 22 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表