Lua 獲取來自socket的數據包,並轉換爲結構體---棋牌修復

最近在做一款棋牌源碼的修復工作,一款常見的遊戲,水果拉霸。由於整個源碼是基於網狐的二次開發的,我以前也做過網狐二開,所以入手很快。不過這次的修復,前端稍微麻煩一點,我發現,前端與子游戲的後端是有一些不相符合的。所以依照遊戲的遊戲規則來修復遊戲.

最主要的是子游戲的服務端向客戶端傳送Lua,lua接受到socket消息後,lua把data轉換爲結構體。這裏是lua客戶端的代碼,在CMD_Game.lua子游戲中,


 

local SlotDef = {}

-- =========服務端數據==========

--空閒狀態

SlotDef.CMD_S_StatusFree = {

    {k = "cbBetCount", t = "byte"},

    {k = "lBetScore", t ="double", l={10}},

    {k = "lPlayerScore", t ="double" },

    {k = "lJackPot", t ="double" },

}

這裏k = cBetCount 爲結構體中的變量名稱,t=byte爲 數據類型,這樣,就定義好了一個結構體了

上面lua代碼的結構體,對應與C++的結構體爲:

//空閒狀態
struct CMD_S_StatusFree
{
    //下注值
    BYTE                            cbBetCount;                            //下注數量
    SCORE                            lBetScore[10];                        //下注大小

    SCORE                            lPlayerScore;                        //玩家錢數
    SCORE                            lJackPot;                            //獎金池
};

然後lua,在socket處,就可讀取data了:

下面的 dataBuffer 是socket讀取的buffer,然後通過函數 ExternalFun.read_netdata 讀取,  ExternalFun是client->src->external->ExternalFun.lua.中的函數

local cmd_table = ExternalFun.read_netdata(SlotDef.CMD_S_StatusFree , dataBuffer)

然後就可以通過 cmd_table 使用其中的數據。

如獲取下注次數:

local betcount = cmd_table.cbBetCount

 

然後給出ExternalFun.read_netdata的源碼,這個應該可以在其他地方用到。

--[[
******
* 結構體描述
* {k = "key", t = "type", s = len, l = {}}
* k 表示字段名,對應C++結構體變量名
* t 表示字段類型,對應C++結構體變量類型
* s 針對string變量特有,描述長度
* l 針對數組特有,描述數組長度,以table形式,一維數組表示爲{N},N表示數組長度,多維數組表示爲{N,N},N表示數組長度
* d 針對table類型,即該字段爲一個table類型,d表示該字段需要讀取的table數據
* ptr 針對數組,此時s必須爲實際長度

** egg
* 取數據的時候,針對一維數組,假如有字段描述爲 {k = "a", t = "byte", l = {3}}
* 則表示爲 變量a爲一個byte型數組,長度爲3
* 取第一個值的方式爲 a[1][1],第二個值a[1][2],依此類推

* 取數據的時候,針對二維數組,假如有字段描述爲 {k = "a", t = "byte", l = {3,3}}
* 則表示爲 變量a爲一個byte型二維數組,長度都爲3
* 則取第一個數組的第一個數據的方式爲 a[1][1], 取第二個數組的第一個數據的方式爲 a[2][1]
******
]]
--讀取網絡消息
function ExternalFun.read_netdata( keyTable, dataBuffer )
	local cmd_table = {};
	--local cmd = cc.cCmd_Data:create()
	--cmd:readscore(int64):getvalue()
	--輔助讀取int64
    local int64 = Integer64.new();
	for k,v in pairs(keyTable) do
		local keys = v;

		------
		--讀取數據
		--類型
		local keyType = string.lower(keys["t"]);
		--鍵
		local key = keys["k"];
		--長度
		local lenT = keys["l"];
		local keyFun = nil;
		if "byte" == keyType then
			keyFun = function() return dataBuffer:readbyte(); end
		elseif "int" == keyType then
			keyFun = function() return dataBuffer:readint(); end
		elseif "word" == keyType then
			keyFun = function() return  dataBuffer:readword(); end
		elseif "dword" == keyType then
			keyFun = function() return  dataBuffer:readdword(); end
		elseif "score" == keyType then
			keyFun = function() return  dataBuffer:readscore(int64):getvalue(); end
		elseif "string" == keyType then
			if nil ~= keys["s"] then
				keyFun = function() return  dataBuffer:readstring(keys["s"]); end
			else
				keyFun = function() return  dataBuffer:readstring(); end
			end			
		elseif "bool" == keyType then
			keyFun = function() return  dataBuffer:readbool(); end
		elseif "table" == keyType then
			cmd_table[key] = ExternalFun.readTableHelper({dTable = keys["d"], lentable = lenT, buffer = dataBuffer, strkey = key})
		elseif "double" == keyType then
			keyFun = function() return  dataBuffer:readdouble(); end
		elseif "float" == keyType then
			keyFun = function() return  dataBuffer:readfloat(); end
		elseif "short" == keyType then
			keyFun = function() return  dataBuffer:readshort(); end
		else
			print("read_netdata error: key==>" .. key .. "; type==>" .. keyType);
		end
		if nil ~= keyFun then
			cmd_table[key] = ExternalFun.read_datahelper({strkey = key, lentable = lenT, fun = keyFun});
		end
	end
	return cmd_table;
end

 

以上就是lua讀取C++通過

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章