遊戲服務端之間內部通訊數的據包解析

2021-08-03 08:00:14 字數 2411 閱讀 5590

db的包傳送結構:

cdatapacket& retpack = allocprotopacket(dcquery);    

(1):cdatapacket& clogicdbreqesthandler::allocprotopacket(const jxsrvdef::intersrvcmd ncmd)

(2):cdatapacket& cdbdataclient::allocdatapacket(const jxsrvdef::intersrvcmd ncmd)

(3):

cdatapacket& ccustomjxserverclientsocket::allocprotopacket(const jxsrvdef::intersrvcmd ncmd)

(4):

inline cdatapacket& allocsendpacket()

(5):

void csendpacketpool::allocsendpacketlist(cbaselist& packetlist, int_ptr nalloccount, cdatapacket **ppsinglealloc)

else

ncount = m_freesendpacklist.count();

}if ( ppsinglealloc && ncount > 0 )

//仍不足需求數量則繼續申請

if ( ppsinglealloc || nalloccount > 0 )

//將剩餘申請的資料報拷貝到申請列表中

if ( nalloccount > 0 ) 

//需要申請乙個單獨的資料報

if ( ppsinglealloc )

}m_freesendpacklist.unlock();

}引擎的db傳送結構:

cdatapacket& datapacket = m_pentity->allocpacket(ap);

(1):

#ifdef _debug

cdatapacket&  cactor::_allocpacket(cactorpacket &pack, lpcstr file, int_ptr line)

#else

cdatapacket&  cactor::allocpacket(cactorpacket &pack)

#endif

pack.packet->reserve(pack.packet->getposition()+sizeof(gatemsghdr));

pgatemsghdr phdr = (pgatemsghdr)pack.packet->getoffsetptr();//保留協議頭部分

pack.nhdrpos = pack.packet->getposition();

phdr->dwgatecode    = rungatecode;

phdr->nsocket    = m_nusersocket;

phdr->wsessionidx= (word)m_ngatesessionindex;

phdr->wident        = gm_data;

phdr->wserveridx = m_nserversessionindex;

phdr->ndatasize = 0;

phdr->wtemp = runtempcode;

phdr->tickcount = _gettickcount();

pack.packet->adjustoffset(sizeof(gatemsghdr));

pack.pactor = this;    

return *pack.packet;

}會話的傳送結構:

cdatapacket &out = allocprotopacket(scheckpasswdresult);

(1):直接引用基類函式:cdatapacket& ccustomjxserverclientsocket::allocprotopacket(const jxsrvdef::intersrvcmd ncmd)

(2):

void ccustomjxserverclientsocket::flushprotopacket(cdatapacket& packet)

ppackhdr->len = (word)ndatasize;

flushsendpacket(packet);

}總結:通過記憶體池申請包,傳送包放到緩衝列表,執行緒從緩衝列表拿到資料進行**。再進行解析,獲取資料.資料獲取

完畢以後還要返回給記憶體池,

通用包結構:

其它發給引擎的話一般用到的是:

customjxserverclientsocket.cpp這個檔案的申請

引擎發給引擎的話一般用到的是:customjxclientsocket.cpp這個檔案的申請(因為傳送給不同客戶的)

當前的幾種開源遊戲服務端介紹

pomelo pomelo 是基於 node.js 的高效能 分布式遊戲伺服器框架。它包括基礎的開發框架和相關的擴充套件元件 庫和工具包 可以幫助你省去遊戲開發枯燥中的重複勞動和底層邏輯的開發。pomelo 不但適用於遊戲伺服器開發,也可用於開發高實時 web 應用,它的分布式架構可以使 pomel...

遊戲服務端定時器的實現

最近在看過一些定時器相關的資料,也讀了一些 比如雲風的skynet的定時器實現,小有啟發,因此將所得整理記錄下來。通常,乙個定時器模組會提供以下三個介面 reg tick timeout,callback unreg tick tick id update timer reg tick註冊乙個tic...

網路遊戲服務端的多執行緒模型

上周四公司有乙個服務端程式的交流,中間討論到如何有效利用現在伺服器的多核優勢,提高單服的負載。稍有經驗的網路遊戲服務端開發人員,首先會想說把檔案讀寫等操作慢速裝置的操作獨立出來,變成單獨的執行緒,那麼我們可能會把網路io,以及檔案log獨立出來,用單獨的執行緒處理。如果乙個遊戲伺服器,僅開了幾個io...