Как я мог встроить сокет в Lua внутренне, как oslib, debuglib? - PullRequest
4 голосов
/ 04 февраля 2010

Я хочу реализовать такую ​​функцию, как встраивание функции сокета в мою сборку Lua. Поэтому мне больше не нужно копировать socket.core.dll (просто для удовольствия).

Я ищу в списке рассылки и вижу, как некоторые ребята обсуждают эту тему, http://lua -users.org / списки / Lua-л / 2005-10 / msg00269.html

Но у меня есть вопрос к деталям шагов, которые могли бы дать мне подробные шаги по изменению кода lua и luasocket, чтобы заставить их работать вместе (не с методом dll).

Я попробовал эти шаги в Windows XP с VC2008:

1) скопировать код luasocket в проект Lua.

2) добавить код

static const luaL_Reg lualibs[] = {
  {"", luaopen_base},
  {LUA_LOADLIBNAME, luaopen_package},
  {LUA_TABLIBNAME, luaopen_table},
  {LUA_IOLIBNAME, luaopen_io},
  {LUA_OSLIBNAME, luaopen_os},
  {LUA_STRLIBNAME, luaopen_string},
  {LUA_MATHLIBNAME, luaopen_math},
  {LUA_DBLIBNAME, luaopen_debug},
  {LUA_SOCKETLIBNAME, luaopen_socket_core}, // add this line
  {LUA_MIMELIBNAME, luaopen_socket_core}, // add this line
  {NULL, NULL}
};

3) соберите проект и запустите его.

Когда я набираю print(socket._VERSION), он показывает luasocket 2.0.2, это правильно.

Когда я набираю print(socket.dns.toip("localhost")), он показывает 127.0.0.1 table: 00480AD0, это тоже правильно.

Но когда я пытаюсь использовать другие функции, например, bind, он не может работать.

Кто мог бы сказать мне причину?

Ответы [ 3 ]

4 голосов
/ 07 ноября 2012

вам нужно поместить вещи luasocket в таблицу package.preload, таким образом:

lua_getfield(L, LUA_GLOBALSINDEX, "package");
lua_getfield(L, -1, "preload");
lua_pushcfunction(L, luaopen_socket_core);
lua_setfield(L, -2, "socket.core");

// add mime.core yourself...
1 голос
/ 20 февраля 2010

luasocket - это смешанный модуль C / lua, вам нужно объединить обе версии в ваше приложение, если вы хотите, чтобы оно работало без каких-либо дополнительных файлов.

socket.lua загружает socket.core (из socket / core.dll)
mime.lua загружает mime.core (из mime / core.dll)

Таким образом, чтобы ваше приложение работало, вам нужно встроить все файлы .dll и .lua в ваше приложение и вручную загрузить их (или настроить их для правильной загрузки через пользовательские загрузчики пакетов).

В электронном письме, которое вы цитировали, вносятся изменения в таблицу package.preload (что сейчас выглядит немного странно, но в любом случае может работать), чтобы встроенный C-код корректно загружался при вызове require.

0 голосов
/ 05 февраля 2010

Попробуйте запустить

for k, v in pairs(socket) do print(k, v) end

и, возможно, мы сможем помочь.

...