Lua 获取来自socket的数据包,并转换为结构体---棋牌修复

2023-05-16

最近在做一款棋牌源码的修复工作,一款常见的游戏,水果拉霸。由于整个源码是基于网狐的二次开发的,我以前也做过网狐二开,所以入手很快。不过这次的修复,前端稍微麻烦一点,我发现,前端与子游戏的后端是有一些不相符合的。所以依照游戏的游戏规则来修复游戏.

最主要的是子游戏的服务端向客户端传送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++通过

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Lua 获取来自socket的数据包,并转换为结构体---棋牌修复 的相关文章

  • 苹果cms详细安装方法

    做影视网站的站长对苹果cms是相当熟悉的 xff0c 毕竟这套系统实在太好用了 xff0c 使它一直火到了今天 xff01 今天小编就带着刚接触到本套程序的大家用它来搭建一次影视视频网站 xff01 程序运行环境 Apache 43 PHP
  • MySQL的版本以及版本号

    针对不同的用户 xff0c MySQL 分为两个版本 xff1a MySQL Community Server xff08 社区版 xff09 xff1a 该版本完全免费 xff0c 但是官方不提供技术支持 MySQL Enterprise
  • MySQL配置教程(图解版)

    配置 MySQL 数据库有两种比较常见的方式 xff0c 分别是使用配置向导和手动更改 xff0c 下面我们来分别介绍一下这两种方式 使用配置向导 步骤 1 xff1a MySQL 安装完成之后 xff0c 进行配置信息的确认 xff0c
  • MySQL常用运算符详解

    MySQL 数据库中的表结构确立后 xff0c 表中的数据代表的意义就已经确定 而通过 MySQL 运算符进行运算 xff0c 就可以获取到表结构以外的另一种数据 例如 xff0c 学生表中存在一个 birth 字段 xff0c 这个字段表
  • Java 文档注释

    Java 支持三种注释方式 前两种分别是 和 xff0c 第三种被称作说明注释 xff0c 它以 开始 xff0c 以 结束 说明注释允许你在程序中嵌入关于程序的信息 你可以使用 javadoc 工具软件来生成信息 xff0c 并输出到HT
  • JSP开发环境搭建(Tomcat的安装和配置)

    使用 JSP 开发程序 xff0c 需要具备对应的运行环境 xff1a Web 浏览器 Web 服务器 JDK 开发工具包 数据库 xff08 MySQL SQL Server 等 xff09 下面以 Windows 操作系统为平台介绍 J
  • JS字符串替换(使用replace()方法)

    replace 方法的第二个参数可以使用函数 xff0c 当匹配时会调用该函数 xff0c 函数的返回值将作为替换文本使用 xff0c 同时函数可以接收以 为前缀的特殊字符 xff0c 用来引用匹配文本的相关信息 约定字符串说明 1 2 9
  • Spring Boot项目搭建步骤(超详细)

    在 Spring Tools 4 for Eclipse 中依次选择 File gt New gt Maven Project xff0c 然后在出现的界面中按图 1 所示增加相关信息 图 1 创建 maven 项目 完了上述操作之后 xf
  • Java Swing JRadioButton:单选按钮组件

    单选按钮与复选框类似都有两种状态 xff0c 不同的是一组单选按钮中只能有一个处于选中状态 Swing 中 JRadioButton 类实现单选按钮 xff0c 它与 JCheckBox 一样都是从 JToggleButton 类派生出来的
  • Java Swing计算器界面的实现

    在本节之前已经详细介绍了 Swing 中容器 布局管理器以及常用的基本组件 本案例将综合运用这些知识实现一个计算器的布局 在本实例中使用两种布局管理器来进行界面设计 计算器界面可以分成两部分 xff0c 即显示区和键盘区 显示区可以使用文本
  • Eclipse 关闭项目

    为什么要关闭项目 xff1f Eclipse 工作空间包含了多个项目 一个项目可以是关闭或开启状态 项目打开过多影响有 xff1a 消耗内存占用编译时间 xff1a 在删除项目 class 文件 xff08 Clean All Projec
  • jQuery EasyUI 树形菜单 - 创建异步树形菜单

    为了创建异步的树形菜单 xff08 Tree xff09 xff0c 每一个树节点必须要有一个 39 id 39 属性 xff0c 这个将提交回服务器去检索子节点数据 创建树形菜单 xff08 Tree xff09 lt ul id 61
  • jQuery EasyUI 树形菜单 - 树形菜单添加节点

    本教程向您展示如何附加节点到树形菜单 xff08 Tree xff09 我们将创建一个包含水果和蔬菜节点的食品树 xff0c 然后添加一些其他水果到已存在的水果节点 创建食品树 首先 xff0c 我们创建食品树 xff0c 代码如下所示 x
  • jQuery EasyUI 树形菜单 - 创建带复选框的树形菜单

    easyui 的树 xff08 Tree xff09 插件允许您创建一个复选框树 如果您点击一个节点的复选框 xff0c 这个点击的节点信息将向上和向下继承 例如 xff1a 点击 39 tomato 39 节点的复选框 xff0c 您将会
  • 系统管理:磁盘分区

    更新中 分区建议 xff1a 根分区做备份 xff0c 存储在另一张磁盘上 xff08 保证备份根分区可用 xff09 根分区尽量小 xff0c 便于备份 var 存储日志 xff0c 单独存储一个分区 home 用户目录 xff0c 单独
  • Error attempting to get column ‘address‘ from result set. Cause: java.sql.SQLException:

    在学习mybatis的resultmap映射的时候遇到了这个问题 The error may exist in mapper EmpMapper xml The error may involve comn sun dao EmpDao g
  • FusionCompute安装和配置步骤

    1 先去华为官网下载FusionCompute的镜像 下载地址 xff1a https support huawei com enterprise zh distributed storage fusioncompute pid 85769
  • 可靠消息案例

    场景 xff1a A项目更新用户信息 xff1b 调用B项目把信息更新 xff1b 非强一致性 xff1b 最终一致 当前使用方式 xff1a 发送Http通知B项目 问题 xff1a 1 xff0c http调用失败怎么办要不要重试 xf
  • 链家提前批校招编程题——极差之和

    题目 xff1a 给定一个长度为N的序列A1到AN xff0c 求所有区间 L R 1 lt 61 L lt 61 R lt 61 N 的极差之和 xff0c 其中区间 L R 的极差定位为A1到AR中最大值与最小值之差 输入 xff1a
  • java.lang.IllegalStateException: Unable to find a @SpringBootConfiguration, you need to use @Context

    开发环境 SpringBoot 43 Mybatis 开发工具IDEA 问题场景 在做Test单元测试的时候出现了这样的异常情况 xff1b 异常信息 java lang IllegalStateException Unable to fi

随机推荐