【问题标题】:Creating topic in publisher (ZeroMQ)在发布者中创建主题(ZeroMQ)
【发布时间】:2019-09-08 00:44:13
【问题描述】:

我一直在为一个发布者和多个订阅者的 PUB-SUB ZeroMQ 系统(用 C 语言)编写代码。 在客户端代码上,我必须根据过滤器订阅一个主题,如下所示:

(...)
void *context = zmq_ctx_new ();
void *subscriber = zmq_socket (context, ZMQ_SUB);
int rc = zmq_connect (subscriber, "tcp://localhost:5555");

char *filter = (argc > 1)? argv [1]: "10001 "; // example of a filter
rc = zmq_setsockopt (subscriber, ZMQ_SUBSCRIBE, filter, strlen (filter));
(...)

但是,查看发布者的代码示例(参见 ZeroMQ 的文档),我没有看到创建主题的任何行:

(...)
void *context = zmq_ctx_new ();
void *publisher = zmq_socket (context, ZMQ_PUB);
int rc = zmq_bind (publisher, "tcp://*:5556");

while (1) {
    (...)
    char update [20];
    sprintf (update, "%05d %d %d", zipcode, temperature, relhumidity);
    s_send (publisher, update);
    (...)

消息只是发送,没有指定主题。这怎么可能?

在 python 版本中,我在发布者代码中看到:

socket.send_string("%d %d" % (topic, number))

但我在 C 中没有见过这样的东西。

【问题讨论】:

  • 没有什么能强迫你发出一个主题。抱歉,ZeroMQ 在这方面是非常宽容的,尽管那时事情可能不会按预期工作。您能否提供您需要解释的代码minimal reproducible example?有太多代码遗漏了,人们不应该为了知道你做了什么而猜测。
  • @UlrichEckhardt 不是真的......他显然在问“你如何在 zmq 中订阅一个主题”,并列出了所有需要这样做的代码。事实上,他的代码有效,只是他不明白为什么,这很容易回答。

标签: c zeromq


【解决方案1】:

发布者没有在 ZMQ 中明确设置主题。主题由消息隐含,从第一个字符开始。 python代码示例只是一个简单的字符串连接,将“主题”添加到消息的前面。

假设你发布了一条消息:

Hello - I am a ZMQ message

订阅

H

Hello

Hello -

都会收到你的消息。

【讨论】:

    【解决方案2】:

    欢迎使用 ZeroMQ Zen-of-Zero。

    消息的所有字节都被认为是 Topic 并且订阅者端指定的“Topic-filtering”对一组简单明了的字节匹配进行操作针对消息的左 n 字节订阅主题。

    那些匹配任何记录主题的消息被认为是要传递的消息,那些不匹配任何一个的则不是(除非设置了反向匹配选项)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多