开发者

How could I embedded socket in Lua internally, just like oslib, debuglib?

I want to implement the function like embedding the socket function in my Lua build. So I don't need to copy socket.core.dll any more (just for fun).

I search the maillist, and see some guys discuss the topic, http://lua-users.org/lists/lua-l/2005-10/msg0开发者_开发知识库0269.html

But I have question for the details steps, who could give me a detailed steps for changing the lua and luasocket code to make them work together (not with dll method).

I tried these steps in windows xp with VC2008:

1) copy luasocket code to Lua project.

2) add some code

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) build the project, and run it.

When I type print(socket._VERSION), it shows luasocket 2.0.2, it is correct.

When I type print(socket.dns.toip("localhost")), it shows 127.0.0.1 table: 00480AD0, it is correct too.

But when I try to use other features, for example bind, it can't work.

Who could tell me the reason?


you need put luasocket stuff into the package.preload table, in this way:

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...


luasocket is a mixed C/lua module, you need to bundle both versions into your application if you want it to work without any extra files.

socket.lua loads socket.core (from socket/core.dll)
mime.lua loads mime.core (from mime/core.dll)

So in order for your application to work you will need to build all the .dll files and the .lua files into your application and manually load them (or set them up to be loaded correctly via custom package loaders).

The email you quoted is tweaking the package.preload table (in a way that appears a tad odd now but might work anyway) to get the built-in C code to be loaded correctly when require is called.


Try running

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

and maybe we'll be able to help.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜