GateServer原始碼筆記

2022-07-17 13:27:12 字數 1069 閱讀 6480

寫了4個月php&nodejs之後,總算有機會能回去寫c++伺服器,而且是一直想從事的遊戲伺服器開發。找同事要了份服務端框架原始碼啃了起來,幾個月沒怎麼寫c++了,有些生疏,在此記錄下原始碼閱讀筆記。整個遊戲伺服器框架分為4個部分,basecode,gateserver,gameserver,dbproxy。其中basecode主要就是基礎類物件,如日誌、共享記憶體、socket等的封裝。基本工作流程是客戶端連線到gateserver,收發遊戲資料;gateserver與gameserver通過兩個共享記憶體物件進行雙工通訊,gameserver處理遊戲邏輯通過dbproxy操作後台資料庫;dbproxy連線資料庫和gameserver,資料庫採用的mysql。

gateserver實現上主要就是單執行緒的epoll,用類tcpctrl封裝了下。初始化部分的工作主要是初始化日誌、讀取配置檔案、註冊處理訊號函式、daemonlize、初始化epoll、建立通訊的共享記憶體物件、寫入pid檔案。

gateserver在記憶體控制上在初始化階段申請好,而不是動態的malloc、free,以便更好的控制記憶體。例如乙個gateserver只服務一定數量的連線,比如20000,做法是採用陣列進行儲存,陣列下標即為套接字描述符。陣列儲存物件為封裝過的連線物件。在初始化階段建立epoll物件,生成監聽套接字並進行註冊,設定監聽套接字的so_reuseaddr、so_keeplive、so_linger、so_sndbuf等選項。

初始化完了,程式迴圈接受、處理訊息,直到程式退出。處理的事件包括退出,即g_shutdown為true;重新載入配置;獲取訊息;檢查是否有資料需要傳送;檢查超時套接字。退出時寫入連線物件統計資訊。獲取訊息主要是接收客戶端的連線和資料,如果是監聽套接字的事件則將accept返回的連線物件新增到連線物件陣列,如果是其他則表示是客戶端發來的資料,進行接收經過一定處理後寫入管道。處理完新連線和資料接收,再檢查是否有資料需要傳送,即從共享記憶體中獲取訊息進行處理,傳送給客戶端,並關閉套接字重置連線物件陣列中的相應物件,即客戶端和gateserver採用短連線的方式進行通訊,每次通訊客戶端建立連線、傳送資料、接收資料然後連線斷開,下一次通訊時重新建立連線。需要處理的另一類事件是檢查是否有超時,即檢查當前時刻與連線物件時間戳是否超過閾值,超過則直接清理連線物件資訊。

hadoop 原始碼筆記

public inte ce tool extends configurable public int run string args throws exception public static void main string args throws exception toolrunner執行...

linux softirq 原始碼 筆記

asmlinkage void do softirq void asmlinkage void do softirq void h pending 1 while pending local irq disable pending local softirq pending if pending m...

URLClassLoader原始碼筆記

在搜尋載入jar檔案時,滿屏都是urlclassloader,簡直是被玩壞了。作為不求甚解的人,都覺得太過不去了,看看原始碼吧。urlclassloader的最終基類是classloader。urlclassloader的直接父類是secureclassloader,僅僅是做了乙個protectio...