我正在尝试将ZeroMQ ZMQ_SERVER套接字集成到Ubuntu上的C ++中的epoll事件循环中。不幸的是我无法让zeromq api给我一个文件描述符。对我来说,他跟随测试方法会产生无效的参数错误:
void test_create_zmq_socket()
{
std::string address = "tcp://127.0.0.1:5558";
void* socket = zmq_socket(zmq_ctx_new(), ZMQ_SERVER);
//bind to address
int error_code = zmq_connect(socket, address.c_str());
std::cout << "INIT CLIENT SOCKET @ " << address << " STATUS: " << error_code << std::endl;
if (error_code < 0)
{
int error = zmq_errno();
std::cout << "ZMQ ERROR " << zmq_strerror(error) << std::endl;
assert(error_code >= 0);
}
size_t temp = 4;
int file_descriptor;
int error = zmq_getsockopt(socket, ZMQ_FD, &file_descriptor, &temp);
if (error < 0)
{
int errorno_val = zmq_errno();
std::cout << "ZMQ ERROR " << zmq_strerror(errorno_val) << std::endl;
assert(error >= 0);
}
std::cout << "FD VAL " << file_descriptor << std::endl;
}
上面的代码片段打印以下输出:
ExamplesREPL:
core/message_handlers/ZMQTest.cpp:36: void core::message_handlers::test_create_zmq_socket(): Assertion `error >= 0' failed.
INIT CLIENT SOCKET @ tcp://127.0.0.1:5558 STATUS: 0
ZMQ ERROR Invalid argument
Process finished with exit code 134 (interrupted by signal 6: SIGABRT)
我可以让套接字发送和接收消息,这样套接字就不会完全无效。
我使用的是ZMQ版本4.2
答案 0 :(得分:0)
经过一些阅读后我发现你无法为任何线程安全套接字检索文件描述符,你必须改为使用新的zeromq轮询器。此轮询器还接受来自其他源的文件描述符,从而允许它们集成到事件循环中。 zeromq源代码的tests文件夹中有一个示例,用于演示此功能。