将ZMQ上下文从C传递给嵌入式Lua

时间:2014-06-05 23:05:01

标签: c lua zeromq

在我的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绑定?

1 个答案:

答案 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");