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++通过

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

chen249191508

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值