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

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 閱讀(1559) 評論(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>
            在线成人小视频| 模特精品裸拍一区| 欧美大片专区| 欧美丰满高潮xxxx喷水动漫| 久久免费高清| 欧美成在线视频| 亚洲国产精品久久久久秋霞不卡| 卡通动漫国产精品| 久久午夜电影| 欧美成人国产| 欧美亚日韩国产aⅴ精品中极品| 国产精品美女久久久久久2018| 国产日韩欧美在线一区| 影音先锋一区| 99成人在线| 午夜精品影院在线观看| 久久精品免费| 欧美激情一区二区三区成人| 夜夜嗨一区二区三区| 久久av红桃一区二区小说| 久久久av毛片精品| 欧美精品观看| 国产亚洲视频在线观看| 亚洲精品小视频在线观看| 午夜免费久久久久| 亚洲国产毛片完整版| 亚洲一区二区在线播放| 免费成人在线视频网站| 亚洲欧洲视频在线| 性欧美xxxx大乳国产app| 免费在线看一区| 国产九区一区在线| 亚洲国产欧美一区二区三区久久| 亚洲欧美日韩专区| 欧美激情一区二区三区高清视频| 亚洲你懂的在线视频| 欧美激情一区二区三区在线视频观看| 国产精品私拍pans大尺度在线 | 亚洲香蕉伊综合在人在线视看| 久久久99免费视频| 亚洲日本一区二区三区| 欧美在线播放| 国产精品日韩久久久| 日韩亚洲不卡在线| 欧美国产一区视频在线观看| 亚洲大片在线观看| 久久中文字幕一区| 在线播放中文一区| 亚洲午夜激情网站| 亚洲国产美女久久久久| 久久精品成人| 国产一区二区三区久久精品| 亚洲欧美国产77777| 亚洲精品视频在线观看网站| 久久一二三国产| 狠狠做深爱婷婷久久综合一区| 亚洲在线黄色| 亚洲国产一区二区三区在线播| 久久久99免费视频| 国产综合第一页| 欧美在线亚洲一区| 一区二区欧美日韩| 欧美日韩一卡| 亚洲性感美女99在线| 亚洲日本无吗高清不卡| 欧美日韩国产美| 亚洲午夜免费视频| 亚洲一区在线观看免费观看电影高清| 欧美日韩一区在线| 亚洲深夜福利在线| 中日韩在线视频| 国产美女扒开尿口久久久| 午夜久久美女| 欧美一区二区三区久久精品茉莉花 | 亚洲免费播放| 夜夜嗨av一区二区三区| 国产精品国产三级国产专播品爱网| 中文网丁香综合网| 一区二区三区高清在线| 久久国产日韩| 黄色成人精品网站| 你懂的成人av| 亚洲激情电影在线| 亚洲人成在线播放网站岛国| 欧美不卡激情三级在线观看| 99在线视频精品| 亚洲图片欧美午夜| 国产日韩综合一区二区性色av| 久久综合色播五月| 欧美精品久久99| 亚洲欧美日韩视频一区| 欧美中文字幕在线播放| 亚洲欧洲日本在线| 中日韩高清电影网| 好男人免费精品视频| 亚洲国产欧美久久| 国产精品一区二区三区四区 | 亚洲美女黄色| 亚洲女同精品视频| 亚洲国产片色| 午夜精品久久久久影视| 永久555www成人免费| 亚洲无限乱码一二三四麻| 一区二区亚洲欧洲国产日韩| 一区二区三区免费看| 亚洲国产日韩欧美综合久久 | 亚洲风情在线资源站| 国产精品免费在线| 亚洲黄色免费网站| 国产亚洲午夜| 一区二区久久久久| 在线播放日韩欧美| 亚洲男人的天堂在线| 艳妇臀荡乳欲伦亚洲一区| 久久精品人人做人人爽| 亚洲欧美日韩国产另类专区| 免费短视频成人日韩| 久久精品一二三| 国产精品久久久久影院亚瑟| 最新高清无码专区| 91久久久久| 另类av导航| 久久午夜国产精品| 国产精品视频一区二区三区| 日韩视频在线观看国产| 99成人在线| 免费成人在线视频网站| 欧美激情aaaa| 亚洲国产精品热久久| 久久久青草青青国产亚洲免观| 午夜一级在线看亚洲| 国产精品av久久久久久麻豆网| 亚洲人成网站色ww在线| 亚洲精品免费在线播放| 欧美/亚洲一区| 91久久嫩草影院一区二区| 亚洲精品乱码久久久久久按摩观| 久久综合九色欧美综合狠狠| 欧美激情精品久久久久久免费印度| 国产日韩专区在线| 一区二区动漫| 亚洲一区二区在线| 性久久久久久久久| 国产美女高潮久久白浆| 午夜精品久久久久久久久久久| 亚洲欧美一区二区三区久久 | 欧美精品自拍| 媚黑女一区二区| 久久综合给合久久狠狠色| 日韩视频在线免费观看| 久久av老司机精品网站导航| 久久久久久亚洲精品杨幂换脸| 国产揄拍国内精品对白| 久久久久久久欧美精品| 老巨人导航500精品| 亚洲黄色大片| 欧美日韩精品在线观看| 亚洲视频中文字幕| 久久三级视频| 亚洲精品三级| 国产精品五区| 麻豆国产精品va在线观看不卡| 欧美激情第10页| 一区二区免费看| 国产精品爽黄69| 美女主播精品视频一二三四| 日韩一区二区福利| 久久琪琪电影院| 一区二区激情| 国产精品国产三级国产a| 国产精品成人久久久久| 午夜欧美不卡精品aaaaa| 国产精品私拍pans大尺度在线 | 亚洲欧美日韩国产中文在线| 久久久亚洲人| av成人毛片| 韩日精品在线| 欧美午夜在线一二页| 久久久久.com| 亚洲一区在线播放| 欧美高清在线一区二区| 亚洲免费一在线| 亚洲福利专区| 国产视频在线观看一区二区| 欧美国产先锋| 久久久久99精品国产片| 亚洲六月丁香色婷婷综合久久| 久久久欧美精品| 亚洲欧美激情四射在线日 | 免费影视亚洲| 香蕉久久久久久久av网站| 亚洲欧洲视频| 激情国产一区二区| 国产农村妇女毛片精品久久麻豆| 欧美激情91| 久久亚洲一区二区三区四区| 亚洲欧美日韩在线综合| 亚洲精品欧美激情| 亚洲欧美日韩国产一区二区| 亚洲精品在线二区|