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.luarequire("socket")含まれているため、再びロードされます。そしてまた。そしてまた。

それは、Lua のパッケージ ローダー システムがループを検出してエラーを発行するほどスマートだからです。それはまさにそれがしたことです。

MODULE_NAME.luaしたがって、実際にその名前のモジュールが必要な場合は、ファイルに名前を付けないでください。

于 2012-10-03T00:31:24.533 に答える