我该如何在Lua内部嵌入Socket,就像oslib、debuglib一样?

4
我希望实现将socket功能嵌入我的Lua构建中的功能。这样我就不需要再复制socket.core.dll了(只是为了好玩)。
我搜索了邮件列表,并看到一些人讨论了这个主题,http://lua-users.org/lists/lua-l/2005-10/msg00269.html 但是我对详细步骤有疑问,谁能给我详细的步骤来更改lua和luasocket代码以使它们一起工作(不使用dll方法)。
我在Windows XP上尝试了以下步骤:
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个回答

6
您需要将 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...

对于像我这样不确定在哪里放置此代码的人,我将其放在我的main()函数中的luaL_openlibs(L);之后。 - mxcl

1

luasocket是一个混合的C/lua模块,如果您想让它在没有任何额外文件的情况下工作,您需要将两个版本捆绑到您的应用程序中。

socket.lua加载socket.core(来自socket/core.dll)
mime.lua加载mime.core(来自mime/core.dll)

因此,为了使您的应用程序正常工作,您需要将所有.dll文件和.lua文件构建到您的应用程序中,并手动加载它们(或通过自定义包装载器设置它们正确地加载)。

您引用的电子邮件正在微调package.preload表(以一种现在看起来有点奇怪但仍可能有效的方式),以便在调用require时正确加载内置的C代码。


0

尝试运行

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

也许我们能够提供帮助。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接