3

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

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) 来清除消息的事实。如果我离开它,则没有消息到达服务器。是否有任何其他可能性可以在不调用睡眠的情况下“刷新”套接字上的消息?我使用 ZeroMQ v3.2.2。

非常感谢你!

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

4

2 回答 2

1

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

zmq_setsockopt(socket, ZMQ_LINGER, 0, sizeof(int));
...
zmq_close(socket);
于 2013-02-05T12:47:41.487 回答
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
于 2013-02-06T06:20:01.717 回答