无睡眠发送ZeroMQ消息()

时间:2013-02-05 12:17:41

标签: c++ zeromq

我有这个ZeroMQ消息在我的C应用程序中发送代码

void *socket= zmq_socket (context, ZMQ_DEALER);
// ...
zmq_msg_t zmsg;
zmq_msg_init_size (&zmsg, msg_size);
memcpy(zmq_msg_data (&zmsg), content, msg_size);
zmq_msg_send (&zmsg, socket, 0);
zmq_msg_close(&zmsg); 
sleep (1);

实际上有效,但我不喜欢我必须调用sleep(1)来清除消息。如果我离开它,没有消息到达服务器。还有其他可能性" flush"在不调用睡眠的情况下输出套接字上的消息?我使用ZeroMQ v3.2.2。

非常感谢!

编辑:此行为似乎仅在调试模式下发生。

2 个答案:

答案 0 :(得分:1)

尝试将ZMQ_LINGER套接字选项设置为0,然后在关闭消息后关闭套接字。

zmq_setsockopt(socket, ZMQ_LINGER, 0, sizeof(int));
...
zmq_close(socket);

答案 1 :(得分:1)

始终确保关闭套接字并终止上下文。在没有尚未发送的消息之前,zmq_term()将不会返回。您可以在套接字上设置LINGER,以指定在丢弃消息之前等待多长时间的上限。默认行为是永远等待。

void *socket= zmq_socket (context, ZMQ_DEALER);
// ...
zmq_msg_t zmsg;
zmq_msg_init_size (&zmsg, msg_size);
memcpy(zmq_msg_data (&zmsg), content, msg_size);
zmq_msg_send (&zmsg, socket, 0);
zmq_msg_close(&zmsg);
zmq_close(socket);
zmq_term(context); // this will block until the message is actually sent