3

每当我运行我的应用程序时,我都会遇到这个错误。错误是: loop or previous error loading module 'socket'

导致此错误的代码是: socket = require("socket").

此错误发生在第一个lua_pcall. 这是调用它的函数:

void startTerminal(int port, char host[80])
{
    lua_State *L = lua_open();

    /* Open Lua Library */
    luaL_openlibs(L);

    /* Choose the lua file that will run */
    if(luaL_loadfile(L, "socket.lua")) {
        lfatal(L, "luaL_loadfile() failed");
    }

    /* Start lua file */
    if(lua_pcall(L, 0, 0, 0)) {
        lfatal(L, "lua_pcall()");
    }

    /* Get connect function */
    lua_getglobal(L, "connect");

    if(!lua_isfunction(L, -1)) {
        lua_pop(L, 1);
        lfatal(L, "lua_isfunction() failed");
    }

    /* Setup arguments */
    lua_pushnumber(L, port);
    lua_pushstring(L, host);

    /* Call the lua function */
    if(lua_pcall(L, 2, 2, 0)) {
        lfatal(L, "lua_pcall() failed");
    }

    /* Print out results */
    printf("%s", lua_tostring(L, -1));
    printf("%s", lua_tostring(L, -1));

    lua_close(L);
}

这是我编译代码的方式:

gcc -Wall -o terminal attacker.c -I/usr/include/lua5.1 -llua5.1 -lm

我在编译期间是否缺少任何开关或者我是否缺少库?

注意:编译器不会抛出任何错误并且可以干净地编译。在其他不包含 C 的 Lua 应用程序中,我对require("socket").

谢谢

4

1 回答 1

7
luaL_loadfile(L, "socket.lua")

这是可疑的。很可疑。

使用标准的 Lua 加载器,当你发出 时require("MODULE_NAME"),它首先会寻找(在检查是否MODULE_NAME已经加载之后)将是“MODULE_NAME.lua”。在当前目录中。这肯定存在。它被称为socket.lua,您已加载并尝试执行的文件。因此,它将尝试socket.lua作为模块加载。

既然socket.lua已经require("socket")在其中,它将再次加载自己。然后再次。然后再次。

好吧,这不会是因为 Lua 的包加载器系统足够聪明,可以检测循环并发出错误。这正是它所做的。

MODULE_NAME.lua因此,如果您确实需要具有该名称的模块,请不要命名文件。

于 2012-10-03T00:31:24.533 回答