传递结构体指针到C服务
#1468
Replies: 2 comments 1 reply
-
你应该把指针编码成字符串传递过去,而不应该直接发送指针。比如使用 tostring(lightuserdata) ,或者自己写一个函数把 lightuserdata 编码成 8 字节。 如果用 tostring(ptr) ,将编码为 userdata: hexnumber 。C side 很容易解码。 skynet.send(addr, "text", tostring(ptr)) -- userdata: xxxxxxx 另外,不建议直接写 C 服务。因为灵活度很低。如果考虑性能,建议写 lua 服务,但不使用 skynet 的框架,而是直接用 skynet.core.callback(dispatch_func) 注册回调函数,在此回调函数中尽快调用 C 代码。参考 skynet.lua 中的 skynet.dispatch_message 实现。这样额外的成本并不会太多。 |
Beta Was this translation helpful? Give feedback.
1 reply
-
虽然不建议把 void * 当作 message 指针传给 C 服务,但 C 服务的确可以不让框架释放这个指针。方法是 callback 函数返回 1 (一般是 0) 。 Lua 服务中如果不想让 C 框架释放消息指针,应该使用 skynet.forward_type 。 |
Beta Was this translation helpful? Give feedback.
0 replies
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
-
现在有一个场景,我使用了第三方的C库,会提供一个多线程可用的client结构体指针,我想把这个指针传递给其余C服务持有,并在相应的服务收到消息后使用该指针。 但是我发现使用skynet.launch启动C服务无法传递lightuserdata,所以使用了自定义的消息ID来发送该结构体指针,但是发送的msg都是void *指针并会在发送完消息后进行free,又由于该结构体指针内部含有void *指针,无法准备sizeof,所以使用memcpy也无法全拷贝。
所以想请问,有没有一般的做法,能把一个全局的结构体指针传给特定C服务,谢谢。
Beta Was this translation helpful? Give feedback.
All reactions