在我的C应用程序中,我有一个ZMQ上下文,我想与所有Lua国家分享。我使用的是Lua 5.2版和ZMQ 3.2版。
我想使用已经可用的Lua绑定,比如lzmq。
例如:
// create ZMQ context
void *ctx = zmq_ctx_new();
...
// create Lua State
lua_State *L = luaL_newstate();
...
// push the context or something
lua_setglobal(L, "MY_ZMQ_CONTEXT");
然后能够以某种方式在Lua中使用ZMQ上下文(使用lzmq的示例):
local zmq = require "lzmq"
require "utils"
print_version(zmq)
local ctx = MY_ZMQ_CONTEXT -- ???
local skt = ctx:socket{zmq.REQ,
linger = 0, rcvtimeo = 1000;
connect = "inproc://hello";
}
skt:send("hello from cli")
print_msg("recv: ",skt:recv())
skt:close()
我该怎么办?使用lzmq还是任何其他ZMQ Lua绑定?
答案 0 :(得分:3)
您可以设置lightuserda并使用init_ctx函数。
lua_pushlightuserdata(L, ctx);
lua_setglobal(L, "MY_ZMQ_CONTEXT");
local zmq = require "lzmq"
local ctx = zmq.init_ctx(MY_ZMQ_CONTEXT)
在这种情况下,您无法关闭Lua的上下文。 我有想法在下一个版本中添加此功能。
lzmq也有C functoin LUAZMQ_EXPORT int luazmq_context (lua_State *L, void *ctx, unsigned char own)
。
你可以像这样包装上下文。
luazmq_contex(L, ctx, 0);
// or if you want hase ability to destroy contex from Lua
// luazmq_contex(L, ctx, 1);
// MY_ZMQ_CONTEXT is lzmq context
lua_setglobal(L, "MY_ZMQ_CONTEXT");