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

loop_in_codes

低調做技術__歡迎移步我的獨立博客 codemaro.com 微博 kevinlynx

WoW服務器模擬器Ascent網絡模塊分析

Ascent網絡模塊

Author: Kevin Lynx

 

Ascent是WoW的服務器模擬器,你可以從它的SVN上獲取它的全部代碼,并從它的WIKI頁面獲取架構起整個服務器的相關步驟。

基本架構:

Ascent網絡模塊核心的幾個類關系如下圖所示:


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

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

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

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

上層模塊通常會派生Socket類,實現一些IO操作的回調。也就說,當某個IO操作完成后,會通過Socket基類讓上層模塊獲取通知。

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

運作之一,接收新的連接

接收新的網絡連接是通過ListenSocket實現的。在創建一個ListenSocket對象時,你需要指定它的模板參數。這個參數通常是一個派生于Socket的類。如下:

ascent-logonserver/Main.cpp

    

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

 

AuthSocket派生于Socket。創建ListenSocket時構造函數指定監聽IP和監聽端口。

 

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

ascent-logonserver/Main.cpp

 

ThreadPool.ExecuteTask(cl);

 

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

ascent-logonserver/ ListenSocketWin32.h

        

  socket = new T(aSocket); //創建AuthSocket并保存網絡套接字aSocket

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

         socket
->Accept(&m_tempAddress); //關聯到完成端口等

Accept函數最終會將新創建的Socket對象保存到SocketMgr對象內部維護的容器里。在這里,還會回調到上層模塊的OnConnect函數,從而實現信息捕獲。

運作之二,接收數據

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

運作之三,發送數據

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

同樣,該網絡模塊的發送模塊也是一樣,沒有緩沖機制。當要發送數據時,直接調用到Socket的Send函數。該函數拷貝用戶數據到自己維護的發送緩沖區,然后將自己的緩沖區指針直接提交給IOCP,WSASend發送。

 

結束

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

 

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

評論

# re: WoW服務器模擬器Ascent網絡模塊分析 2008-04-11 13:47 Bugs

已閱  回復  更多評論   

# re: WoW服務器模擬器Ascent網絡模塊分析 2008-07-21 21:41 是是

海星  回復  更多評論   

# re: WoW服務器模擬器Ascent網絡模塊分析 2010-06-23 11:25 游客

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

# re: WoW服務器模擬器Ascent網絡模塊分析[未登錄] 2011-03-11 16:48 BERT

“我們可以看出,該網絡模塊實現得很一般。在接受數據部分,網絡工作者線程回調到對應的Socket對象,Socket直接對數據進行上層邏輯處理。”

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

青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            欧美日韩一区在线观看| 亚洲欧美激情一区| 伊人天天综合| 国产麻豆91精品| 国产亚洲免费的视频看| 欧美三级网址| 国产精品爽爽ⅴa在线观看| 国产精品丝袜久久久久久app| 国产精品国产三级国产| 欧美激情第二页| 久久精品视频99| 国产欧美日韩一级| 国产在线日韩| 亚洲免费在线| 国产精品一区二区三区四区| 欧美日韩精品综合| 9人人澡人人爽人人精品| 亚洲女性喷水在线观看一区| 欧美电影资源| 国产毛片久久| 亚洲麻豆一区| 亚洲视频成人| 日韩亚洲欧美精品| 久久久久www| 影音先锋久久精品| 欧美电影免费| 牛夜精品久久久久久久99黑人| 免费在线视频一区| 欧美激情无毛| 亚洲电影在线看| 麻豆精品在线视频| 欧美国产日韩一区| 欧美高清视频一区| 欧美jizzhd精品欧美巨大免费| 欧美激情中文字幕一区二区| 日韩亚洲综合在线| 亚洲第一毛片| 亚洲伊人色欲综合网| 新片速递亚洲合集欧美合集| 亚洲永久免费av| 久久爱91午夜羞羞| 蜜桃av一区二区| 久久久精品国产免大香伊| 狂野欧美一区| 欧美激情性爽国产精品17p| 久久久999精品视频| 国产精品拍天天在线| 国产精品99久久久久久久女警| 欧美大胆人体视频| 欧美日韩精品是欧美日韩精品| 国产综合激情| 在线观看免费视频综合| 亚洲综合三区| 亚洲丝袜av一区| 欧美日韩国产天堂| 99日韩精品| 亚洲综合色噜噜狠狠| 国产精品第一页第二页第三页| 亚洲欧洲综合另类| 亚洲欧美日本在线| 久久精品国产欧美亚洲人人爽| 欧美性生交xxxxx久久久| 国产精品久久一卡二卡| 亚洲精品一区久久久久久| 国产精品高潮在线| 日韩一级大片| 老司机午夜精品| 久久香蕉国产线看观看av| 性欧美超级视频| 午夜亚洲伦理| 在线天堂一区av电影| 夜夜嗨av色一区二区不卡| 99国产精品久久久久老师| 欧美剧在线观看| 一本色道久久综合亚洲精品不| 欧美一级黄色录像| 亚洲黄色尤物视频| 亚洲欧美色婷婷| 欧美日韩一区二区三区四区在线观看 | 欧美性生交xxxxx久久久| 美女图片一区二区| 母乳一区在线观看| 亚洲激情小视频| 欧美亚洲视频一区二区| 美女福利精品视频| 久久久精品国产免大香伊| 欧美成人有码| 国产精品99久久久久久白浆小说| 中文国产亚洲喷潮| 欧美精品一区三区| 欧美在线黄色| 久久精品免费观看| 一本色道久久综合狠狠躁篇的优点| 欧美电影打屁股sp| 欧美精品福利| …久久精品99久久香蕉国产| 亚洲免费在线| 久久久亚洲欧洲日产国码αv| 国模私拍一区二区三区| 欧美成人有码| 欧美高清在线视频| 亚洲国产女人aaa毛片在线| 欧美日韩视频专区在线播放| 亚洲一区二区在线免费观看| 国产精品草莓在线免费观看| 一区二区日韩欧美| 欧美国产一区二区三区激情无套| 夜夜精品视频| 伊人久久久大香线蕉综合直播| 欧美黄免费看| 欧美日韩第一区日日骚| 国产精品wwwwww| 欧美国产精品久久| 亚洲高清网站| 欧美在线免费观看| 中文欧美在线视频| 久久精品国产久精国产爱| 中国av一区| 午夜一区二区三区不卡视频| 国产日韩欧美不卡在线| 欧美高清一区二区| 精品99一区二区| 亚洲精品一区在线| 国产精品欧美一区二区三区奶水| 亚洲精品一区二区三区在线观看| 中日韩男男gay无套| 欧美日韩精品一区视频| 亚洲美女尤物影院| av不卡在线观看| 亚洲自拍另类| 欧美亚洲视频在线观看| 亚洲第一区中文99精品| 欧美视频在线观看视频极品| 亚洲精品一区二区三| 伊人成综合网伊人222| 美国成人直播| 亚洲第一黄色| 亚洲精品乱码久久久久久久久| 欧美亚洲免费在线| 亚洲精品综合| 欧美夫妇交换俱乐部在线观看| 亚洲美女av网站| 美女91精品| 亚洲一区二区影院| 欧美怡红院视频一区二区三区| 亚洲成在线观看| 国产精品毛片a∨一区二区三区|国| 欧美一区二区三区四区在线观看地址| 中文国产一区| 猫咪成人在线观看| 国产精品v亚洲精品v日韩精品| 国内精品福利| 亚洲欧美在线一区| 国产精品成人午夜| 日韩一级精品| 日韩一级大片| 国产精品久久久久久模特 | 日韩视频不卡| 麻豆精品视频在线观看| 亚洲视频精选| 国产精品二区在线| 亚洲一区二区三区四区五区黄| 欧美激情一区二区三区| 理论片一区二区在线| 精品成人在线视频| 欧美大片一区二区三区| 久久久欧美一区二区| 欧美成人第一页| 亚洲一区二区不卡免费| 夜夜精品视频一区二区| 国产麻豆综合| 欧美高清在线视频| 欧美日韩成人综合天天影院| 亚洲午夜小视频| 欧美一进一出视频| 91久久精品国产91久久| 亚洲一区二区三区视频播放| 国产精品亚洲片夜色在线| 久久综合亚洲社区| 欧美伦理91i| 久久久噜噜噜久噜久久| 欧美精品一区三区| 久久九九全国免费精品观看| 亚洲一区三区在线观看| 欧美一区在线直播| 亚洲黄色免费| 午夜欧美电影在线观看| 亚洲精品美女久久久久| 国产精品进线69影院| 国产精品私房写真福利视频| 亚洲国产精品精华液网站| 国产精品videossex久久发布| 久久久久高清| 国产综合色在线视频区| 亚洲在线免费| 午夜精品99久久免费| 欧美日韩一区二区三区在线看| 欧美成人69av| 亚洲国产精品精华液网站| 男人天堂欧美日韩|