更多课程 选择中心

C/C++培训
达内IT学院

400-111-8989

Lua与C的交互设计是怎样的?

  • 发布:C++培训
  • 来源:问答库
  • 时间:2020-05-20 16:18

主要目的是通过lua将短信发送的服务信息转换成服务系统支持的格式。设计思想是Lua转换服务消息,消息的通信由C实现,因为SGIP协议消息封装和转换到后台服务是由C实现的.

调用Lua函数

1、首先,Lua必须被初始化。这主要是lua_open和luaL_openlibs函数

2、然后我们解析并编译lua的代码,这主要是luaL_dofile函数

3、解析后,使用lua_getglobal来指示要调用的lua函数。

4、如果有lua函数的参数,使用lua_pushstring函数传递参数

5、最后,调用lua_pcall来调用lua函数

6、调用完成后,可以使用lua_tonumber类函数获得函数的返回结果

Lua调用c函数

1、函数的调用是在Lua中进行的。必须注册该函数。这是通过lua_register完成的

2、在Lua中调用注册的函数将会调用上面注册的函数(类似于回调),所有的处理都在这个函数中

3、Lua_tostring类函数可以用在这个函数中来获得函数的参数

4、如果有返回值,则由lua_pushnumber返回。

参考代码

下面的代码用于将联通的短信转换的,同时注册了一个发送短信功能,供Lua在Lua中发送短信。

#include <lua.h>

#include <lauxlib.h>

#include <lualib.h>

#define cutil_log_error printf

#define cutil_log_debug printf

/**

* LuaSendSms

* 当Lua里面调用SendSms函数时候会触发该函数

*/

static int LuaSendSms(lua_State *L)

{

char *pszPhone = "";

char *pszMessage = "";

// 读取并判读参数

if(lua_gettop(L) != 2)

{

lua_pushstring(L, "Incorrect argument number!");

lua_error(L);

}

if(!lua_isnumber(L, 1) || !lua_isstring(L, 2))

{

lua_pushstring(L, "Incorrect argument!");

lua_error(L);

}

pszPhone = lua_tostring(L, 1);

pszMessage = lua_tostring(L, 2);

// 发送消息 TODO

cutil_log_debug("Send Message %s to %s.\n", pszMessage, pszPhone);

// 返回结果

lua_pushnumber(L, 0);

// 只有一个返回结果

return 1;

}

/**

* LuaProcessSms

* 调用Lua里面的LuaMain函数进行消息的处理

*/

static int LuaProcessSms(lua_State *L, char *pszPhone, char *pszMessage)

{

int nRet;

char *pszRetInfo;

cutil_log_debug("process phone %s message %s\n", pszPhone, pszMessage);

// 调用函数和参数

lua_getglobal(L, "LuaMain");

lua_pushstring(L, pszPhone);

lua_pushstring(L, pszMessage);

if(nRet = lua_pcall(L, 2, 2, 0))

{

cutil_log_error("lua_pcall error ret %d error '%s'. phone %s message %s\n",

nRet, lua_tostring(L, -1), pszPhone, pszMessage);

lua_settop(L, 0);

return -1;

}

// 判读返回参数合法性

if(lua_gettop(L) != 2)

{

cutil_log_error("Incorrect return number. %d phone %s message %s\n",

lua_gettop(L), pszPhone, pszMessage);

lua_settop(L, 0);

return -1;

}

if(!lua_isnumber(L, 1) || !lua_isstring(L, 2))

{

cutil_log_error("Incorrect return. arg1 %s arg2 %s phone %s message %s\n",

lua_tostring(L, 1), lua_tostring(L, 2),

pszPhone, pszMessage);

lua_settop(L, 0);

return -1;

}

// 获取并处理返回信息 TODO

nRet = lua_tonumber(L, 1);

pszRetInfo = strdup(lua_tostring(L, 2));

lua_settop(L, 0);

cutil_log_debug("Ret %d Info %s\n", nRet, pszRetInfo);

if(nRet != 0)

{

cutil_log_error("process info error phone %s message %s ret %d info %s\n",

pszPhone, pszMessage, nRet, pszRetInfo);

free(pszRetInfo);

return -1;

}

free(pszRetInfo);

return 0;

}

/**

* LuaInit

* 初始化Lua库,并注册一个SendSms函数

*/

static lua_State *LuaInit()

{

lua_State *L = lua_open();

if(L == NULL)

{

cutil_log_error("Init the lua library error\n");

return NULL;

}

luaL_openlibs(L);

/* register our function */

lua_register(L, "SendSms", LuaSendSms);

return L;

}

int main()

{

int i;

lua_State *L;

L = LuaInit();

if (luaL_dofile(L, "sms.lua"))

error(L, "cannot run configuration file: %s",

lua_tostring(L, -1));

for(i = 0; i < 1; i ++)

LuaProcessSms(L, "13988227711", "测试消息");

lua_close(L);

}

下面是参考的Lua程序

1、函数名称必须为LuaMain

2、函数里面可以调用SendSms进行消息发送,第一个参数是手机号码,第二个参数是内容

3、函数的参数有两个phone是手机号码 message是接收到的短信内容

4、返回参数有两个 第一个是返回值0表示成功,其他失败,第二个是要求发送的内容

function LuaMain(phone, message)

print("phone ", phone, "message", message)

SendSms('13988221133', '你好')

return 0,'KZCZ函数的参数有两个phone是手机号码 message是接收到的短信内容'

这个里面可以有全局的代码,不过建议不要编写, 全局的代码会在LuaMain函数之前运行

版权声明:转载文章来自公开网络,版权归作者本人所有,推送文章除非无法确认,我们都会注明作者和来源。如果出处有误或侵犯到原作者权益,请与我们联系删除或授权事宜。

预约申请免费试听课

填写下面表单即可预约申请免费试听!怕钱不够?可就业挣钱后再付学费! 怕学不会?助教全程陪读,随时解惑!担心就业?一地学习,可全国推荐就业!

上一篇:函数模板与类模板教程
下一篇:如何使用c/c++提升iOS性能?

空指针到底是什么意思?

a[i] = i++ 到底对不对?

C++培训哪家好?全方位对比机构

C/C++中的必须熟记的基础知识

  • 扫码领取资料

    回复关键字:视频资料

    免费领取 达内课程视频学习资料

  • 搜索抖音号

    搜索抖音号:1821685962

    免费领取达内课程视频学习资料

Copyright © 2021 Tedu.cn All Rights Reserved 京ICP备08000853号-56 京公网安备 11010802029508号 达内时代科技集团有限公司 版权所有

选择城市和中心
黑龙江省

吉林省

河北省

湖南省

贵州省

云南省

广西省

海南省