无法从零MQ ZMQ_SERVER套接字中获取文件描述符

Cant Get File Descriptor From Zero MQ ZMQ_SERVER Socket

本文关键字:套接字 获取 文件 描述 SERVER MQ ZMQ      更新时间:2023-10-16

我试图将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

阅读后,我发现您无法为任何线程安全套接字检索文件描述符,而必须使用新的Zeromq Poller。该民意测验者还接受来自其他来源的文件描述符,从而使它们可以集成到事件循环中。Zeromq源代码的测试文件夹中有一个示例,该文件码说明了此功能。