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

在我的 C 应用程序中,我有一个单独的 ZMQ 上下文,我希望将其与所有 Lua 状态共享。我使用 Lua 版本 5.2 和 ZMQ 版本 3.2。

我想使用一个已经可用的 Lua 绑定,比如 lzmq。

例如:

// 创建 ZMQ 上下文
void *ctx = zmq_ctx_new();
...
// 创建 Lua 状态
lua_State *L = luaL_newstate();
...
// 推送上下文或者其他东西
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 绑定?

点赞
用户2328287
用户2328287

你可以设置lightuserdata并使用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 函数 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");
2014-06-06 03:39:16