程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> Jump The Great Firewall【step14 嵌入lua】,step14lua

Jump The Great Firewall【step14 嵌入lua】,step14lua

編輯:關於C語言

Jump The Great Firewall【step14 嵌入lua】,step14lua


首先這裡需要宣傳一下,qtun的網站已經開張了,功能正在逐步添加中。

一、嵌入lua的原因

由於qtun的可配置參數不斷增多,因此有必要將參數寫入到配置文件之中。又由於C語言並不擅長做字符串的處理,因此加入了輕量級的lua腳本語言,同時嵌入lua更有助於加入第三方插件的支持。

二、代碼的修改

  • script_global_init函數 script_global_init函數在init_lua過程中被調用,用於初始化lua環境
    int script_global_init(lua_State* lua)
    {
        load_lib(lua, "_G", luaopen_base);
        load_lib(lua, LUA_TABLIBNAME, luaopen_table);
        load_lib(lua, LUA_STRLIBNAME, luaopen_string);
        load_lib(lua, LUA_IOLIBNAME, luaopen_io);
        
        lua_pushcfunction(lua, _syslog);
        lua_setglobal(lua, "_syslog");
        
        init_qtun_state(lua);
        init_qtun_conf(lua);
        init_qtun_log(lua);
        return 1;
    }
    
    從代碼中可知:qtun.state和qtun.conf通過metatable將C對象映射到lua中,qtun.log中只定義了log等級的常量
  • script_load_config函數 script_load_config函數通過調用scripts/load_config.lua腳本來載入配置文件
    int script_load_config(lua_State* lua, library_conf_t* conf, const char* file_path)
    {
        char path[MAX_PATH];
        lua_pushlightuserdata(lua, conf);
        lua_setglobal(lua, "__conf__");
        
        strcpy(path, qtun->this_path);
        strcat(path, "scripts/load_config.lua");
        if (luaL_dofile(lua, path) != 0)
        {
            fprintf(stderr, "%s\n", lua_tostring(qtun->lua, -1));
            lua_close(qtun->lua);
            exit(1);
        }
        return 1;
    }
    
  • 下面我們來看一下main函數的整個流程
  • 三、lua腳本

    最後讓我們來分別看一下這三個lua腳本長啥樣

    四、完整代碼

    完整代碼可到step14中查看

    1. 上一頁:
    2. 下一頁:
    Copyright © 程式師世界 All Rights Reserved