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

loop_in_codes

低調(diào)做技術(shù)__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

WoW服務(wù)器模擬器Ascent網(wǎng)絡(luò)模塊分析

Ascent網(wǎng)絡(luò)模塊

Author: Kevin Lynx

 

Ascent是WoW的服務(wù)器模擬器,你可以從它的SVN上獲取它的全部代碼,并從它的WIKI頁面獲取架構(gòu)起整個服務(wù)器的相關(guān)步驟。

基本架構(gòu):

Ascent網(wǎng)絡(luò)模塊核心的幾個類關(guān)系如下圖所示:


ThreadBase屬于Ascent線程池模塊中的類,它實現(xiàn)了一個job類,當(dāng)其被加入到線程池中開始執(zhí)行時,線程池管理器會為其分配一個線程(如果有線程資源)并多態(tài)調(diào)用到ThreadBase派生類的run函數(shù)。

SocketWorkerThread用以代表IOCP網(wǎng)絡(luò)模型中的一個工作者線程,它會從IOCP結(jié)果隊列里取出異步IO的操作結(jié)果。這里的IOCP使用的完成鍵是Socket對象指針。SocketWorkerThread獲取到IO操作結(jié)果后,根據(jù)獲得的完成鍵將結(jié)果通知給具體的Socket對象。(Socket的說明見后面)

ListenSocket代表一個監(jiān)聽套接字。該網(wǎng)絡(luò)模塊其實只是簡單地將socket中的概念加以封裝。也就說,它依然把一個套接字分為兩種類型:監(jiān)聽套接字和數(shù)據(jù)套接字(代表一個網(wǎng)絡(luò)連接)。所謂的監(jiān)聽套接字,是指只可以在該套接字上進行監(jiān)聽操作;而數(shù)據(jù)套接字則只可以在此套接字上進行發(fā)送、接收數(shù)據(jù)的操作。

Socket代表我上面說的數(shù)據(jù)套接字。ListenSocket是一個類模板,為這個模板指定的模板參數(shù)通常是派生于Socket的類。其實這里使用了這個小技巧隱藏了工廠模式的細節(jié)。因為ListenSocket被放在一個單獨的線程里運作,當(dāng)其接受到一個新的網(wǎng)絡(luò)連接時,就創(chuàng)建一個Socket派生類對象。(ListenSocket類如何知道這個派生類的類名?這就是通過類模板的那個模板參數(shù))

上層模塊通常會派生Socket類,實現(xiàn)一些IO操作的回調(diào)。也就說,當(dāng)某個IO操作完成后,會通過Socket基類讓上層模塊獲取通知。

SocketMgr是一個全局單件類。它主要負責(zé)一些網(wǎng)絡(luò)庫的全局操作(例如winsock庫的初始化),它還維護了一個容器,保存所有的Socket對象。這其實是它的主要作用。

運作之一,接收新的連接

接收新的網(wǎng)絡(luò)連接是通過ListenSocket實現(xiàn)的。在創(chuàng)建一個ListenSocket對象時,你需要指定它的模板參數(shù)。這個參數(shù)通常是一個派生于Socket的類。如下:

ascent-logonserver/Main.cpp

    

ListenSocket<AuthSocket> * cl = new ListenSocket<AuthSocket>(host.c_str(), cport);

 

AuthSocket派生于Socket。創(chuàng)建ListenSocket時構(gòu)造函數(shù)指定監(jiān)聽IP和監(jiān)聽端口。

 

因為ListenSocket派生于ThreadBase,屬于線程池job,因此要讓ListenSocket工作起來,只需要將其加入到線程池管理器:

ascent-logonserver/Main.cpp

 

ThreadPool.ExecuteTask(cl);

 

ListenSocket開始運作起來后,會阻塞式地WSAAccept。如果WSAAccept返回一個有效的套接字,ListenSocket就創(chuàng)建一個Socket派生類對象(類型由模板參數(shù)指定),在上面舉的例子中,也就是AuthSocket:

ascent-logonserver/ ListenSocketWin32.h

        

  socket = new T(aSocket); //創(chuàng)建AuthSocket并保存網(wǎng)絡(luò)套接字aSocket

         socket
->SetCompletionPort(m_cp);//保存完成端口對象

         socket
->Accept(&m_tempAddress); //關(guān)聯(lián)到完成端口等

Accept函數(shù)最終會將新創(chuàng)建的Socket對象保存到SocketMgr對象內(nèi)部維護的容器里。在這里,還會回調(diào)到上層模塊的OnConnect函數(shù),從而實現(xiàn)信息捕獲。

運作之二,接收數(shù)據(jù)

在windows平臺下,該網(wǎng)絡(luò)模塊使用的是IOCP模型,屬于異步IO。當(dāng)接收新的連接時,即發(fā)出WSARecv的IO操作。在工作者線程中,也就是SocketWorkerThread中,會根據(jù)IOCP完成鍵得到Socket對象指針,然后根據(jù)不同的IO操作結(jié)果多態(tài)回調(diào)到Socket派生類對應(yīng)的函數(shù)。例如如果是WSARecv完成,則調(diào)用到AuthSocket::OnRead函數(shù)(上述例子)。OnRead函數(shù)直接可以獲取到保存數(shù)據(jù)的緩沖區(qū)指針。事實上,每一個Socket對象在被創(chuàng)建時,就會自動創(chuàng)建接收緩沖區(qū)以及發(fā)送緩沖區(qū)。

運作之三,發(fā)送數(shù)據(jù)

分析到這里,我們可以看出,該網(wǎng)絡(luò)模塊實現(xiàn)得很一般。在接受數(shù)據(jù)部分,網(wǎng)絡(luò)工作者線程回調(diào)到對應(yīng)的Socket對象,Socket直接對數(shù)據(jù)進行上層邏輯處理。更好的做法是當(dāng)工作者線程回調(diào)到上層Socket(Socket的派生類)時,這里應(yīng)該簡單地將數(shù)據(jù)組織成上層數(shù)據(jù)包并放入上層數(shù)據(jù)包隊列,讓上層邏輯稍后處理,而不是讓網(wǎng)絡(luò)模塊自己去處理。這樣做主要是考慮到多線程模型。

同樣,該網(wǎng)絡(luò)模塊的發(fā)送模塊也是一樣,沒有緩沖機制。當(dāng)要發(fā)送數(shù)據(jù)時,直接調(diào)用到Socket的Send函數(shù)。該函數(shù)拷貝用戶數(shù)據(jù)到自己維護的發(fā)送緩沖區(qū),然后將自己的緩沖區(qū)指針直接提交給IOCP,WSASend發(fā)送。

 

結(jié)束

該網(wǎng)絡(luò)模塊實現(xiàn)的似乎有點簡陋,在該模塊之上也沒有數(shù)據(jù)校驗、數(shù)據(jù)加密的模塊(這些動作散亂地分布在最上層邏輯)。在架構(gòu)上也沒能很好地將概念區(qū)分開來,Socket套用了原始socket中的數(shù)據(jù)套接字,而不是我所希望的NetSession。可以圈點的地方在于該模塊很多地方使用了回調(diào)函數(shù)表,從而方便地實現(xiàn)事件傳送。

 

posted on 2008-04-02 21:22 Kevin Lynx 閱讀(4480) 評論(4)  編輯 收藏 引用 所屬分類: game develop

評論

# re: WoW服務(wù)器模擬器Ascent網(wǎng)絡(luò)模塊分析 2008-04-11 13:47 Bugs

已閱  回復(fù)  更多評論   

# re: WoW服務(wù)器模擬器Ascent網(wǎng)絡(luò)模塊分析 2008-07-21 21:41 是是

海星  回復(fù)  更多評論   

# re: WoW服務(wù)器模擬器Ascent網(wǎng)絡(luò)模塊分析 2010-06-23 11:25 游客

ascent代碼還能獲取嗎?
請問svn地址?  回復(fù)  更多評論   

# re: WoW服務(wù)器模擬器Ascent網(wǎng)絡(luò)模塊分析[未登錄] 2011-03-11 16:48 BERT

“我們可以看出,該網(wǎng)絡(luò)模塊實現(xiàn)得很一般。在接受數(shù)據(jù)部分,網(wǎng)絡(luò)工作者線程回調(diào)到對應(yīng)的Socket對象,Socket直接對數(shù)據(jù)進行上層邏輯處理。”

博主沒仔細看吧?
虛函數(shù)OnRead做了解包,將數(shù)據(jù)組織成上層數(shù)據(jù)包并放入上層數(shù)據(jù)包隊列,讓上層邏輯稍后處理  回復(fù)  更多評論   

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            日韩亚洲欧美中文三级| 欧美在线看片a免费观看| 久久综合久久美利坚合众国| 在线观看成人av电影| 亚洲激精日韩激精欧美精品| 欧美日韩免费一区二区三区| 欧美一区二视频在线免费观看| 久久不见久久见免费视频1| 亚洲美女视频网| 午夜精品一区二区三区在线| 最新高清无码专区| 亚洲综合视频网| 亚洲激情专区| 亚洲影院免费| 一本色道久久综合亚洲91| 欧美一区二区在线视频| 一区二区三区欧美在线| 欧美影院视频| 亚洲一区二区精品在线| 玖玖在线精品| 久久er99精品| 欧美日韩在线另类| 欧美成人一区二区三区片免费| 国产精品久久久久久久久免费樱桃| 男人的天堂成人在线| 国产精品久久久久久av下载红粉 | 亚洲日产国产精品| 国产精品手机视频| 欧美 日韩 国产精品免费观看| 国产精品成人免费精品自在线观看| 麻豆九一精品爱看视频在线观看免费| 欧美午夜不卡在线观看免费| 欧美国产欧美亚洲国产日韩mv天天看完整| 国产精品一区二区a| 亚洲精品视频在线播放| 亚洲一区二区三区高清不卡| 亚洲精品护士| 久久久久一区二区三区| 久久精品动漫| 国产精品美女www爽爽爽| 亚洲片在线观看| 亚洲欧洲在线一区| 久久婷婷麻豆| 久久综合久久综合这里只有精品| 国产精品一区二区久久 | 在线观看亚洲a| 性xx色xx综合久久久xx| 香港久久久电影| 国产精品久久久久久久久久三级| 日韩图片一区| 一本久道综合久久精品| 欧美高清视频www夜色资源网| 免费日韩视频| 极品日韩久久| 久久久久久久久岛国免费| 欧美专区在线播放| 国产欧美一区二区三区另类精品| 亚洲手机视频| 亚洲欧美日韩一区在线观看| 国产精品久久久久久久久久三级| 亚洲小说春色综合另类电影| 性刺激综合网| 国内精品视频一区| 久久成人这里只有精品| 免费试看一区| 亚洲国产一区在线| 欧美国产精品日韩| 日韩一级片网址| 亚洲综合社区| 国内精品99| 欧美成人免费在线| 99热免费精品| 欧美中文在线观看| 136国产福利精品导航| 欧美成人免费一级人片100| 亚洲免费高清视频| 午夜在线成人av| 韩国一区二区在线观看| 暖暖成人免费视频| 亚洲精品国产无天堂网2021| 亚洲永久精品大片| 国产亚洲一区二区在线观看| 久久综合999| 中文在线一区| 久久综合综合久久综合| 亚洲精品永久免费精品| 欧美特黄一级| 久久婷婷国产综合精品青草| 一区二区日本视频| 久久综合色影院| 亚洲视频在线一区观看| 国产综合色精品一区二区三区| 免费成人高清在线视频| 亚洲夜晚福利在线观看| 欧美+日本+国产+在线a∨观看| 在线视频欧美一区| 国产亚洲欧美另类中文| 欧美激情综合亚洲一二区| 亚洲欧美日韩综合| 亚洲国产精品第一区二区| 欧美一二三区精品| 亚洲欧洲在线免费| 国产婷婷一区二区| 欧美日韩福利| 久久综合色综合88| 欧美成人精品高清在线播放| 宅男精品视频| 亚洲电影免费观看高清完整版在线观看 | 日韩视频在线观看免费| 亚洲在线成人| 在线欧美日韩精品| 国产精品分类| 欧美成人精品激情在线观看| 午夜在线视频观看日韩17c| 亚洲第一福利在线观看| 欧美中文字幕不卡| 中日韩午夜理伦电影免费| 怡红院精品视频| 国产欧美日韩免费| 欧美日韩妖精视频| 暖暖成人免费视频| 久久久精彩视频| 欧美亚洲日本一区| 亚洲一区二区免费看| 最新精品在线| 欧美国产日产韩国视频| 久久综合久久综合久久综合| 久久gogo国模裸体人体| 羞羞色国产精品| 亚洲午夜久久久久久久久电影院| 欧美一级日韩一级| 99精品欧美一区二区三区| 在线免费不卡视频| 国产午夜久久久久| 国产精品二区影院| 国产精品爱啪在线线免费观看| 欧美大片在线看| 母乳一区在线观看| 麻豆成人在线| 美女尤物久久精品| 久久躁狠狠躁夜夜爽| 久久久久国色av免费观看性色| 欧美一区二区在线免费播放| 欧美一区深夜视频| 性亚洲最疯狂xxxx高清| 亚洲欧美韩国| 新67194成人永久网站| 午夜日韩在线观看| 欧美亚洲一区在线| 欧美一区国产二区| 久久久国产精彩视频美女艺术照福利| 久久精品免视看| 欧美不卡三区| 亚洲人成网站色ww在线| 欧美三级在线播放| 欧美日韩一区二区三区视频 | 中文av一区二区| 亚洲视频综合在线| 亚洲一区二区三区在线视频| 亚洲欧美亚洲| 久久精品国产亚洲一区二区| 久久久久久久久久久一区 | 国产精品va| 国产精品尤物| 国产一区视频在线看| 亚洲高清在线观看| 欧美色视频在线| 国产精品一区二区久激情瑜伽| 国产亚洲精品久| 在线观看国产精品网站| 亚洲精品国精品久久99热| av不卡在线| 久久久久国产精品人| 亚洲第一精品夜夜躁人人躁| 一本色道久久综合一区| 在线视频你懂得一区二区三区| 欧美在线亚洲在线| 精品动漫一区| 国产日韩欧美精品一区| 久久蜜桃香蕉精品一区二区三区| 欧美一级专区| 久久成人精品| 亚洲在线一区二区三区| 日韩亚洲欧美一区| 免费日韩一区二区| 亚洲私人黄色宅男| 亚洲高清自拍| 国产精品久久久久久影院8一贰佰| 国产精品久久久久久久久免费| 欧美揉bbbbb揉bbbbb| 欧美精品国产| 久久久一区二区| 亚洲三级影院| 亚洲一区二区三区高清不卡| 欧美一区二区福利在线| 免费看成人av| 一区二区三区产品免费精品久久75| 午夜一区二区三区在线观看| 欧美jizz19性欧美| 国产精品中文字幕欧美|