对一个消息的跟踪的来龙去脉

KernelModule/AttemperEngine.cpp
//队列接口
 OnQueueServiceSink(BYTE cbThreadIndex,WORD wIdentifier,void * pBuffer, WORD wDataSize,DWORD dwInsertTime)
中的网络读取事件
 有这些句
 _BEGIN_TRY
 {
  bSuccess = m_pIAttemperEngineSink->OnEventSocketRead(cbThreadIndex,pSocketReadEvent->Command,pSocketReadEvent+1,pSocketReadEvent->wDataSize,pSocketReadEvent);
 }
 CATCH_COMON_EXCEPTION(;)
 CATCH_UNKNOW_EXCEPTION(;)
 _END_CATCH
 
IAttemperEngineSink    * m_pIAttemperEngineSink;   //挂接接口
而这个挂接的接口被CenterServer,GameFrameModule,PlazaServer三个类都有继承,那么如何知道调用的函数OnEventSocketRead是响应GameFrameModule中的
CAttemperEngineSink::OnEventSocketRead??   
--------------------------------------------------------------------
GameFrameModule/AttemperEngine.cpp
  //网络事件
OnEventSocketRead(BYTE cbThreadIndex,CMD_Command Command,void * pDataBuffer,WORD wDataSize,NTY_SocketReadEvent * pSocketReadEvent)
中的游戏消息
OnSocketMainGame(Command,pDataBuffer,wDataSize,pSocketReadEvent);
----------------------------------------------------------------------
GameFrameModule/AttemperEngine.cpp
 //游戏消息处理
 OnSocketMainGame(CMD_Command,void * pDataBuffer,WORD wDataSize,NTY_SocketReadEvent * pSocketReadEvent)
中的消息处理
 //获取用户
 IServerUserItem * pIServerUserItem=GetServerUserItem(pSocketReadEvent->wIndex);
 if (pIServerUserItem==NULL) return false;

 //处理过虑
 tagServerUserData * pUserData=pIServerUserItem->GetUserData();
 if ((pUserData->UserStatus.wTableID==INVALID_TABLE)||(pUserData->UserStatus.wChairID==INVALID_CHAIR)) return true;

 //消息处理
 CTableFrame * pTableFrame=(m_pTableFrame+pUserData->UserStatus.wTableID);
 return pTableFrame->OnEventSocketGame(Command.wSubCmdID,pDataBuffer,wDataSize,pIServerUserItem);
------------------------------------------------------------------
GameFrameModule/TableFrame.cpp
 //游戏事件处理
bool __cdecl CTableFrame::OnEventSocketGame(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
{
 //效验参数
 GT_ASSERT(pIServerUserItem!=NULL);
 GT_ASSERT(m_pITableFrameSink!=NULL);

 //消息处理
 return m_pITableFrameSink->OnGameMessage(wSubCmdID,pDataBuffer,wDataSize,pIServerUserItem);
}
 ITableFrameSink     * m_pITableFrameSink;    //桌子接口
-----------------------------------------------------------------------------------------------
到这里为止,现在具体的实现也就在于具体的游戏模块中的了
//游戏桌子类
class CTableFrameSink : public ITableFrameSink, public ITableFrameEvent
此游戏模块中的类已经继承了,ITableFrameSink
所以加执行如下重载函数
bool __cdecl CTableFrameSink::OnGameMessage(WORD wSubCmdID, const void * pDataBuffer, WORD wDataSize, IServerUserItem * pIServerUserItem)
{
 switch (wSubCmdID)
 {
 case SUB_C_ADD_GOLD: //用户加注
  {
   //效验数据
   tagServerUserData * pUserData=pIServerUserItem->GetUserData();

   //消息处理
   CMD_C_AddGold * pAddGold=(CMD_C_AddGold *)pDataBuffer;
   
   //游戏加注处理
   OnUserAddGold(pUserData->UserStatus.wChairID,pAddGold,false);

   return true;
  }
 case SUB_C_YiCi:
  {
   tagServerUserData * pUserData=pIServerUserItem->GetUserData();
   if (pUserData->UserStatus.cbUserStatus!=US_PLAY) return true;
   if (m_bPlayStatus[pUserData->UserStatus.wChairID]==FALSE) return true;
  //
    BYTE cbQuChair = pUserData->UserStatus.wChairID;
   
   m_cGameLogic.m_bAddGold[cbQuChair][m_cbQuIndex[cbQuChair][m_cbQuCount[cbQuChair]-1]]
                    -= m_wQuValue[cbQuChair][ m_cbQuCount[cbQuChair]-1 ];//索引 

      m_fAddGoldSum[cbQuChair] -= m_wQuValue[cbQuChair][ m_cbQuCount[cbQuChair]-1 ];//投注总和

   m_iAllAddGoldsum -= m_wQuValue[cbQuChair][ m_cbQuCount[cbQuChair]-1 ];//桌面总注数

     CMD_S_AddGold OwnAddGold;
   ZeroMemory(&OwnAddGold,sizeof(OwnAddGold));

   OwnAddGold.iIndex = m_cbQuIndex[cbQuChair][m_cbQuCount[cbQuChair]-1];
   OwnAddGold.iValue = m_wQuValue[cbQuChair][ m_cbQuCount[cbQuChair]-1 ];
   OwnAddGold.iValueSum = m_iAllAddGoldsum;

   m_pITableFrame->SendTableData(cbQuChair,SUB_S_QuYiCi,&OwnAddGold,sizeof(OwnAddGold));
   
   --m_cbQuCount[cbQuChair];
   return true;
  }
 case SUB_C_QuanBu:
  {
   tagServerUserData * pUserData=pIServerUserItem->GetUserData();
   if (pUserData->UserStatus.cbUserStatus!=US_PLAY) return true;
   if (m_bPlayStatus[pUserData->UserStatus.wChairID]==FALSE) return true;
   //
   BYTE cbQuChair = pUserData->UserStatus.wChairID;
   
   memset( m_cGameLogic.m_bAddGold[cbQuChair],0,sizeof(m_cGameLogic.m_bAddGold[cbQuChair]) );//索引

   m_iAllAddGoldsum -= m_fAddGoldSum[cbQuChair];//桌面总注数

   m_fAddGoldSum[cbQuChair] = 0;//投注总和
     
   memset( m_cbQuIndex[cbQuChair],0,sizeof(m_cbQuIndex[cbQuChair]) );
   memset( m_wQuValue[cbQuChair],0,sizeof(m_wQuValue[cbQuChair]) );
   m_cbQuCount[cbQuChair] = 0;

   m_pITableFrame->SendTableData(cbQuChair,SUB_S_QuQuanBu,0,0);
   return true;
  }
  //视频配置
 case SUB_S_VEDIOSTREAM:
  {
   tagServerUserData * pUserData=pIServerUserItem->GetUserData();
   //
   BYTE cbQuChair = pUserData->UserStatus.wChairID;

   CMD_S_VedioStream vedioStream;
   WORD wSize = sizeof(vedioStream);
   ZeroMemory(&vedioStream,wSize);
   _tcscpy(vedioStream.szMainStream,m_pGameServiceOption->szMainVideoID);
   _tcscpy(vedioStream.szSubStream,m_pGameServiceOption->szSubVideoID);
   m_pITableFrame->SendTableData(cbQuChair,SUB_S_VEDIOSTREAM,&vedioStream,wSize);
  }
 default:
  return true;
 }

 return false;
}

-----------------------------------------------------------
解决方案以下

--------------------------------------------------------------

现在跟踪下OnQueueServiceSink,在此之前一定会有将m_pIAttemperEngineSink进行赋值的,而且一定在AtteperEngine.cpp里
KernelModule/QueueService.cpp

//数据消息
void CQueueService::OnQueueServiceThread(BYTE cbThreadIndex, const tagDataHead & DataHead, void * pBuffer, WORD wDataSize)
{
 GT_ASSERT(m_pIQueueServiceSink!=NULL);
 _BEGIN_TRY 
 {
  m_pIQueueServiceSink->OnQueueServiceSink(cbThreadIndex,DataHead.wIdentifier,pBuffer,DataHead.wDataSize,DataHead.dwInsertTime);
 }
 CATCH_COMMON_EXCEPTION(;)
  CATCH_UNKNOWN_EXCEPTION(;)_END_CATCH
 return;
}
IQueueServiceSink    * m_pIQueueServiceSink;    //回调接口
怎么跑到QueueService.cpp中去了呢
先不管,看看OnQueueServiceThread函数是在哪执行的吧
//Run函数
bool CQueueServiceThread::RepetitionRun()
{
 //效验参数
 GT_ASSERT(m_hCompletionPort!=NULL);

 //变量定义
 DWORD dwThancferred=0;
 OVERLAPPED * pOverLapped=NULL;
 CQueueService * pQueueService=NULL;

 //等待完成端口
 if (GetQueuedCompletionStatus(m_hCompletionPort,&dwThancferred,(PULONG_PTR)&pQueueService,&pOverLapped,INFINITE))
 {
  //判断退出
  if (pQueueService==NULL) return false;

  //获取数据
  tagDataHead DataHead;
  bool bSuccess=pQueueService->GetData(DataHead,m_cbBuffer,sizeof(m_cbBuffer));
  GT_ASSERT(bSuccess==true);

  //处理数据
  if (bSuccess==true) pQueueService->OnQueueServiceThread(m_cbThreadIndex, DataHead,m_cbBuffer,DataHead.wDataSize);

  return true;
 }

 return false;
}
看来这个方向是错了,那么,m_pIAttemperEngineSink的赋值应该就在AttemperEngine.cpp里的某个初始值里的,或是先于OnQueueServiceSink执行

而在这里,只有发现一个注册钩子的函数有对m_pIAttemperEngineSink进行赋值操作
//注册钩子
bool __cdecl CAttemperEngine::SetAttemperEngineSink(IUnknownEx * pIUnknownEx)
{
 //效验参数
 ASSERT(pIUnknownEx!=NULL);
 ASSERT(m_pIAttemperEngineSink==NULL);
 if (pIUnknownEx==NULL) return false;
 if (m_pIAttemperEngineSink!=NULL) return false;

 //查询接口
 m_pIAttemperEngineSink=GET_OBJECTPTR_INTERFACE(pIUnknownEx,IAttemperEngineSink);
 if (m_pIAttemperEngineSink==NULL)
 {
  CEventTrace::ShowEventNotify(TEXT("调度引擎外挂服务接口获取失败,挂接操作失败"),Level_Exception);
  return false;
 }

 return true;
}
没办法,只能去找这个函数在其它哪个文件中被调用了吧
KernelModule/ServiceEngine.cpp
//注册钩子
bool __cdecl CServiceEngine::SetAttemperEngineSink(IUnknownEx * pIUnknownEx)
{
 return m_AttemperEngine.SetAttemperEngineSink(pIUnknownEx);
}
可是这边设置的对象还不是我所想看到的,我所要看到的是CenterServer,GameFrameModule,PlazaServer三者其中之一的对象

不过在这里看到亮点了.
只有三个地方有调用这个函数
那就是
1.CenterServer/CenterService.cpp
//开始服务
bool CCenterService::StartService()
{
  ...
  if (m_ServiceEngine->SetAttemperEngineSink(pIAttemperEngine)==false)
  ...
}
CServiceEngineHelper   m_ServiceEngine;     //服务引擎
2.GameFremeModule/GameService.cpp
//开始服务
bool _cdecl CGameService::StartService(tagGameServiceParameter * pGameServiceParameter)
{
  ...
  if (m_ServiceEngine->SetAttemperEngineSink(pIAttemperEngine)==false) throw 0;
  ...
}
CServiceEngineHelper   m_ServiceEngine;     //服务引擎
3.PlazaServer/PlazaServer.cpp
//开始服务
bool CPlazaService::StartLogonService()
{
   ...
   //注册调度外挂服务
   IUnknownEx * pIAttemperEngine=GET_OBJECT_INTERFACE(m_AttemperSink,IUnknownEx);
   if (m_ServiceEngine->SetAttemperEngineSink(pIAttemperEngine)==false) throw 0;
   ...
}
CServiceEngineHelper   m_ServiceEngine;     //服务引擎


发现了这一点后,哇,原来是这样的呢,哈哈.明白了


 

转载于:https://www.cnblogs.com/belie8/archive/2011/08/08/2131252.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值