Как я мог встроить сокет в Lua внутренне, как oslib, debuglib?

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

Я просматриваю список рассылки и вижу, как некоторые ребята обсуждают эту тему, http://lua-users.org/lists/lua-l/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, это тоже правильно.

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

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


person sagasw    schedule 04.02.2010    source источник


Ответы (3)


вам нужно поместить материал 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...
person douyw    schedule 07.11.2012
comment
Для таких людей, как я, которые не знали, куда поместить этот код, я поместил его после: luaL_openlibs(L); в моем main(). - person mxcl; 27.04.2013

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

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

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

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

person Etan Reisner    schedule 20.02.2010

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

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

и, может быть, мы сможем помочь.

person Norman Ramsey    schedule 05.02.2010