2017-04-21 129 views
0

我想將ZeroMQ ZMQ_SERVER套接字集成到Ubuntu上的C++的epoll事件循環中。不幸的是,我不能讓zeromq API給我一個文件描述符。對我來說,他下面的測試方法產生一個無效參數錯誤:無法獲取文件描述符從零MQ ZMQ_SERVER套接字

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) 

我可以得到套接字來發送和接收消息,以便插座ISN」完全不起作用。

我使用ZMQ版本4.2

+0

你在64位系統上嗎?這個電話是否可能需要一個64位整數?你有沒有嘗試過:size_t temp = sizeof(file_descriptor) –

+0

我正在使用一個64位的操作系統,按照你的建議,我已經嘗試了8個16,32和64位整數類型,只是爲了確保它們都產生相同的錯誤信息。 zmqapi的文檔表明文件描述符返回值是一個32位整數。上述代碼適用於其他類型的ZMQ套接字(即,如果將套接字類型從ZMQ_SERVER更改爲ZMQ_DEALER,代碼將返回有效的文件描述符)。 –

回答

0

一些閱讀,我發現,你不能檢索文件描述符任何線程安全插座後,必須改用新zeromq輪詢。該輪詢器還接受來自其他源的文件描述符,從而允許將它們集成到事件循環中。在zeromq源代碼的測試文件夾中有一個示例演示了此功能。

相關問題