青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

Error

C++博客 首頁 新隨筆 聯系 聚合 管理
  217 Posts :: 61 Stories :: 32 Comments :: 0 Trackbacks
相關UML:



CAttempterEngine實現了兩個接口:IQueueServiceSink、IAttemperEngine;
通過前面的分析,偶們了解到,IQueueServiceSink這個接口被是用來處理CQueueService中的數據的,根據上面的UML我們可以看到,CAttemperEngine關聯了一個CQueueService(或者直接點說是:持有了一個CQueueService對象,說組合也成)。這樣的話這個CAttemperEngine暴露出來的接口就只剩下IAttemperEnging了。

1 //啟動服務
2 virtual bool __cdecl StartService();
3 //停止服務
4 virtual bool __cdecl StopService();
5 //設置網絡
6 virtual bool __cdecl SetSocketEngine(IUnknownEx * pIUnknownEx);
7 //注冊鉤子
8 virtual bool __cdecl SetAttemperEngineSink(IUnknownEx * pIUnknownEx);
9 //獲取接口
10 virtual void * __cdecl GetQueueService(const IID & Guid, DWORD dwQueryVer);

這個接口有兩處值得單獨討論的:SetSocketEngine、GetQueueService;
SetSocketEngine,后面的分析中還會出現,我覺得這里是一個設計上的失誤導致需要暴露socket引擎接口;
GetQueueService的設計思路可能是說,每個IAttemperEngine接口背后都有一個CQueueService,從以后的分析中可以看到,這個思路是理解整個kernel的關鍵。調度引擎應該是一個消息匯總(從個個引擎產生的消息)然后派發到IAttemperEngineSink。因為代碼中是沒有看到有關ITimerSink  ISocketSink之類的東東的,,,
整個消息是個引擎產生,然后投遞到指定的CQueueService,然后匯總到這里被派發到IAttemperEngineSink出去的,,,

看看CAttemperEngine中處理數據的代碼:
 1//隊列接口
 2void __cdecl CAttemperEngine::OnQueueServiceSink(WORD wIdentifier, void * pBuffer, WORD wDataSize, DWORD dwInsertTime)
 3{
 4    //內核事件
 5    ASSERT(m_pIAttemperEngineSink!=NULL);
 6    switch (wIdentifier)
 7    {
 8    case EVENT_TIMER:            //定時器事件
 9        {
10            //效驗參數
11            ASSERT(wDataSize==sizeof(NTY_TimerEvent));
12            if (wDataSize!=sizeof(NTY_TimerEvent)) return;
13
14            //處理消息
15            NTY_TimerEvent * pTimerEvent=(NTY_TimerEvent *)pBuffer;
16            m_pIAttemperEngineSink->OnEventTimer(pTimerEvent->wTimerID,pTimerEvent->wBindParam);
17
18            return;
19        }

20    case EVENT_DATABASE:        //數據庫事件
21        {
22            //效驗參數
23            ASSERT(wDataSize>=sizeof(NTY_DataBaseEvent));
24            if (wDataSize<sizeof(NTY_DataBaseEvent)) return;
25
26            //處理消息
27            NTY_DataBaseEvent * pDataBaseEvent=(NTY_DataBaseEvent *)pBuffer;
28            m_pIAttemperEngineSink->OnEventDataBase(pDataBaseEvent+1,wDataSize-sizeof(NTY_DataBaseEvent),pDataBaseEvent);
29
30            return;
31        }

32    case EVENT_SOCKET_ACCEPT:    //網絡應答事件
33        {
34            //效驗大小
35            ASSERT(wDataSize==sizeof(NTY_SocketAcceptEvent));
36            if (wDataSize!=sizeof(NTY_SocketAcceptEvent)) return;
37
38            //處理消息
39            NTY_SocketAcceptEvent * pSocketAcceptEvent=(NTY_SocketAcceptEvent *)pBuffer;
40            m_pIAttemperEngineSink->OnEventSocketAccept(pSocketAcceptEvent);
41
42            return;
43        }

44    case EVENT_SOCKET_READ:        //網絡讀取事件
45        {
46            //效驗大小
47            NTY_SocketReadEvent * pSocketReadEvent=(NTY_SocketReadEvent *)pBuffer;
48            ASSERT(wDataSize>=sizeof(NTY_SocketReadEvent));
49            ASSERT(wDataSize==(sizeof(NTY_SocketReadEvent)+pSocketReadEvent->wDataSize));
50            if (wDataSize<sizeof(NTY_SocketReadEvent)) return;
51            if (wDataSize!=(sizeof(NTY_SocketReadEvent)+pSocketReadEvent->wDataSize)) return;
52
53            //處理消息
54            bool bSuccess=false;
55            try 
56            
57                bSuccess=m_pIAttemperEngineSink->OnEventSocketRead(pSocketReadEvent->Command,pSocketReadEvent+1,pSocketReadEvent->wDataSize,pSocketReadEvent);
58            }

59            catch ()    { }
60            if (bSuccess==false) m_pITCPSocketEngine->CloseSocket(pSocketReadEvent->wIndex,pSocketReadEvent->wRoundID);
61
62            return;
63        }

64    case EVENT_SOCKET_CLOSE:    //網絡關閉事件
65        {
66            //效驗大小
67            ASSERT(wDataSize==sizeof(NTY_SocketCloseEvent));
68            if (wDataSize!=sizeof(NTY_SocketCloseEvent)) return;
69
70            //處理消息
71            NTY_SocketCloseEvent * pSocketCloseEvent=(NTY_SocketCloseEvent *)pBuffer;
72            m_pIAttemperEngineSink->OnEventSocketClose(pSocketCloseEvent);
73
74            return;
75        }

76    }

77
78    //其他事件
79    m_pIAttemperEngineSink->OnAttemperEvent(wIdentifier,pBuffer,wDataSize,dwInsertTime); 
80
81    return;
82}

這個函數中一個很重要的參數:wIdentifier;
可以來追溯一下他的源頭:
 1//數據消息
 2void CQueueService::OnQueueServiceThread(const tagDataHead & DataHead, void * pBuffer, WORD wDataSize)
 3{
 4    ASSERT(m_pIQueueServiceSink!=NULL);
 5    try    
 6    
 7        m_pIQueueServiceSink->OnQueueServiceSink(DataHead.wIdentifier,pBuffer,DataHead.wDataSize,DataHead.dwInsertTime); 
 8    }

 9    catch ({}
10    return;
11}
可以看見他是直接保存在最底層的那個DataStroage里邊的,這個在上一章分析中可以看到。(個引擎利用CQueueServiceEvent  Post數據的時候就攜帶了類型信息)

另外一個要注意的點是對socket事件的處理,我之前認為調度引擎組合了一個socket引擎是一個設計缺陷,應為這里的在處理socket read事件的時候如果異常了直接直接使用引擎來關閉socket而不是調用socket sink的指定接口。猜想也許是不希望客戶端直接處理socket句柄吧,,,




還是用一句話描述下調度引擎:
調度引擎的工作可以這樣描述消息匯總、派發。其他引擎通過CQueueServiceEvent將消息post到調度引擎上來(通過共享同一個CQueueService),然后由調度引擎集中派發出去,,,
posted on 2011-06-07 09:37 Enic 閱讀(1560) 評論(0)  編輯 收藏 引用 所屬分類: 網狐棋牌源碼分析
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            欧美一区=区| 国产精品私拍pans大尺度在线| 亚洲盗摄视频| 久久久www| 久久久久88色偷偷免费| 欧美一级午夜免费电影| 欧美一级黄色网| 久久久久久穴| 美女福利精品视频| 欧美激情第3页| 亚洲成人中文| 亚洲美女毛片| 亚洲一区二区av电影| 亚洲一区二区免费在线| 欧美一区1区三区3区公司| 久久电影一区| 美女日韩欧美| 欧美午夜视频在线| 国产一区二区三区丝袜| 亚洲精品乱码久久久久久| 亚洲图片在区色| 久久久久欧美精品| 亚洲国产欧美一区二区三区丁香婷 | 亚洲欧美日韩国产一区二区| 久久精品盗摄| 国产精品成人免费视频| 国产一区二区三区在线观看精品| 亚洲国产福利在线| 亚洲五月婷婷| 免费久久99精品国产自在现线| 亚洲激情在线观看视频免费| 亚洲欧美国产另类| 亚洲美女在线观看| 亚洲欧美视频在线观看视频| 美女视频一区免费观看| 国产精品久久久久久久9999| 亚洲国产精品传媒在线观看| 午夜国产精品视频| 欧美激情中文字幕一区二区| 亚洲欧美在线观看| 欧美日韩国语| 亚洲精品国产精品久久清纯直播| 亚洲欧美日韩直播| 亚洲国产欧美日韩精品| 久久久久国产精品一区| 国产精品二区在线观看| 91久久国产自产拍夜夜嗨| 亚洲免费一级电影| 亚洲第一页在线| 欧美一级午夜免费电影| 欧美午夜宅男影院| 亚洲韩国一区二区三区| 久久精品亚洲一区二区三区浴池| 亚洲另类春色国产| 久久综合导航| 国产综合av| 欧美在线短视频| 夜夜嗨av一区二区三区中文字幕 | 好看不卡的中文字幕| 亚洲影音一区| 一本一本久久a久久精品牛牛影视| 久久婷婷亚洲| 国产自产高清不卡| 久久国产乱子精品免费女 | 久久国产乱子精品免费女 | 欧美激情中文字幕在线| 伊人久久亚洲影院| 久久亚洲精品一区| 久久久久久91香蕉国产| 红桃视频成人| 亚洲高清中文字幕| 欧美巨乳在线观看| 一本色道久久综合狠狠躁的推荐| 亚洲精品日韩一| 国产精品高清在线观看| 亚洲欧美视频一区二区三区| 亚洲欧美中文另类| 韩国久久久久| 亚洲黄色一区| 国产精品久久二区二区| 欧美中文字幕视频在线观看| 久久久久久香蕉网| 日韩视频一区二区在线观看| av不卡免费看| 国产亚洲一区在线| 欧美电影免费观看高清| 欧美日韩国产一级| 性做久久久久久久久| 久久在线免费观看视频| 亚洲深夜福利| 午夜在线观看欧美| 精品成人一区二区三区| 亚洲第一主播视频| 欧美日韩欧美一区二区| 亚洲午夜一二三区视频| 久久精品免费看| 1000部国产精品成人观看| 欧美大片免费久久精品三p| 久久在线免费视频| 一本高清dvd不卡在线观看| 亚洲精品日韩精品| 亚洲国产aⅴ天堂久久| 国产精品www994| 久久九九电影| 欧美二区在线看| 亚洲精品免费在线观看| 欧美一级视频免费在线观看| 亚洲激情精品| 亚洲一级电影| 国产精品久久久99| 男人的天堂亚洲| 欧美日韩国产成人高清视频| 亚洲欧美日韩综合aⅴ视频| 午夜亚洲精品| 亚洲伊人色欲综合网| 久久九九有精品国产23| 亚洲精品一二三| 久久久99国产精品免费| 国产精品久久一级| 欧美成人日本| 国产精品美女久久久久久久| 欧美一区二区精美| 欧美视频一区| 欧美成人精品h版在线观看| 欧美日韩午夜剧场| 亚洲午夜一区| 欧美日韩一区二区视频在线观看 | 亚洲女人天堂av| 久久综合狠狠综合久久激情| 午夜精品久久久久久99热| 欧美成人精品三级在线观看| 久久一区二区三区超碰国产精品| 欧美片第一页| 久久久欧美精品sm网站| 欧美日韩一区在线| 国产一区91精品张津瑜| 日韩网站在线看片你懂的| 红杏aⅴ成人免费视频| 一区二区三区日韩精品视频| 国产综合久久久久久| 在线亚洲自拍| 亚洲日本视频| 久久免费视频这里只有精品| 久热爱精品视频线路一| 国产情人综合久久777777| 亚洲精品久久视频| 亚洲福利免费| 欧美国产一区二区三区激情无套| 久久伊人亚洲| 国产亚洲二区| 亚洲免费在线播放| 欧美在线亚洲一区| 国产精品免费久久久久久| 亚洲三级视频| 99国产一区二区三精品乱码| 欧美日韩成人综合天天影院| 亚洲精品1区2区| 亚洲日本视频| 久久aⅴ乱码一区二区三区| 欧美1区2区3区| 亚洲丰满少妇videoshd| 久久综合99re88久久爱| 亚洲狼人精品一区二区三区| 在线视频精品一区| 欧美区在线观看| 亚洲精品午夜| 亚洲综合欧美| 国产日韩专区在线| 久久精品人人爽| 免费成人性网站| 午夜精品久久久99热福利| 国产欧美日韩免费| 欧美一区激情| 最新国产精品拍自在线播放| 亚洲视频欧洲视频| 国产精品美女久久久免费| 亚洲精品国产精品国自产观看浪潮 | 国产综合精品一区| 久久人人爽人人爽爽久久| 亚洲第一色在线| 亚洲一区二区三区视频播放| 激情懂色av一区av二区av| 麻豆精品91| 欧美成人精品在线| 久久久999成人| 亚洲欧美影音先锋| 欧美日精品一区视频| 国产精品视频九色porn| 一区二区三区国产盗摄| 猛男gaygay欧美视频| 蜜桃av噜噜一区| 午夜精品www| 国产精品亚洲不卡a| 亚洲免费观看| 久久综合久久久久88| 亚洲国产视频一区二区| 亚洲国产精品久久久久秋霞不卡| 亚洲国产综合在线| 欧美三级电影大全| 久久精品国产亚洲aⅴ|