ZeroMQ如何管理zmq::proxy和zmq::poll中的socket?

How does ZeroMQ manage socket in zmq::proxy and zmq::poll?

我遇到了关于 ZeroMQ 的问题,因为我在 zmq::proxy 和 zmq::poll 的 ZMQ 套接字上使用了指针。这样做会发生错误 88 的异常(非套接字上的套接字操作)。

实际上 ZeroMQ 希望用户发送一个在 void* (source of the information)

中强制转换的结构

我在官方文档中做了一些研究,但我没有找到为什么 ZeroMQ 不在套接字上使用指针。

编辑:这是我认为正确的代码

zmq::socket_t frontend_;
zmq::socket_t backend_;
zmq::proxy(&frontend_, &backend_, nullptr);

实际有效的代码是这个:

zmq::socket_t frontend_;
zmq::socket_t backend_;
zmq::proxy((void *)frontend_, (void *)backend_, nullptr);

这对我来说很奇怪。为什么 ZeroMQ 会这样做?

没有什么奇怪的。

指针存在于 socket_t class 中,运算符 static_cast<void *>() 方法返回此指针而不是使用 class 的实际实例。

Can a cast operator be explicit?

这 post 帮助我理解了 official documentation test of zmq 中出现的问题。在c++11中是不可能直接使用的

zmq::proxy(frontend_, backend_, nullptr);

因为转换在 zmq 代码中是显式的。所以你需要像这样正确地投射套接字:

zmq::proxy(static_cast<void *>(frontend_), static_cast<void *>(backend_), nullptr);