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
你在64位系統上嗎?這個電話是否可能需要一個64位整數?你有沒有嘗試過:size_t temp = sizeof(file_descriptor) –
我正在使用一個64位的操作系統,按照你的建議,我已經嘗試了8個16,32和64位整數類型,只是爲了確保它們都產生相同的錯誤信息。 zmqapi的文檔表明文件描述符返回值是一個32位整數。上述代碼適用於其他類型的ZMQ套接字(即,如果將套接字類型從ZMQ_SERVER更改爲ZMQ_DEALER,代碼將返回有效的文件描述符)。 –