【问题标题】:C++ ZMQ Pub and Sub not connectingC++ ZMQ Pub 和 Sub 未连接
【发布时间】:2022-11-19 18:50:46
【问题描述】:

我目前正在从事一个项目,该项目需要我通过 ZMQ 套接字连接两个终端,而我当前的解决方案是通过 PUB-SUB 套接字功能实现的。但是,当我运行程序时,当发布者发送消息时,订阅者永远不会收到任何消息。我试过更改它们之间的 IP 地址,并尝试在 sub 和 pub 之间“强制发送”消息,但无济于事。

代码的简化形式:

服务器.cpp:

#include <zmq.h>

const char* C_TO_S = "tcp://127.0.0.1:5557";

const char* S_TO_C = "tcp://127.0.0.1:5558";

int main() {
  zmq::context_t context(1);
  zmq::socket_t pub(context, ZMQ_PUB);
  zmq::socket_t sub(context, ZMQ_SUB);

  int sndhwm = 0;

  sub.connect(C_TO_S);
  pub.bind(S_TO_C);
  sub.setsockopt(ZMQ_SUBSCRIBE, &sndhwm, sizeof(sndhwm));

  //cout << C_TO_S << endl;

  while(true) {
    zmq::message_t rx_msg;
    sub.recv(&rx_msg);
    cout << "b\n";
    // other code goes here
  }
}

客户端.cpp:

#incldue <zmq.h>

const char* C_TO_S = "tcp://127.0.0.1:5557";

const char* S_TO_C = "tcp://127.0.0.1:5558";

void network_thread() {
  zmq::context_t context(1);
  zmq::socket_t pub(context, ZMQ_PUB);
  zmq::socket_t sub(context, ZMQ_SUB);

  int sndhwm = 0;

  sub.connect(S_TO_C);
  pub.connect(C_TO_S);
  sub.setsockopt(ZMQ_SUBSCRIBE, &sndhwm, sizeof(sndhwm));

  while (true) {
    cout << pub.send("a", strlen("a"), 0);
    cout << "AA\n";
  }
  
  // Other code that doesn't matter
}  

Client.cpp中的main在单独的线程中调用network_thread,然后spaming publisher将消息“a”发送给server。但是,服务器没有收到来自客户端的任何消息。如果服务器收到任何消息,它会打印出“b”,但它从不这样做。我也知道发布者正在发送消息,因为它在执行时打印出“1”。

此外,假设客户端订阅者和服务器发布者有一个目的。虽然它们也不能在 atm 上工作,但对另一组的修复应该转化为对这些的修复。

我试过更改端口、发送垃圾邮件等。没有任何结果导致服务器收到任何消息。

任何帮助将不胜感激,谢谢。

【问题讨论】:

    标签: c++ zeromq publish-subscribe


    【解决方案1】:

    您在 SUB 套接字上设置消息过滤器选项。这意味着您将只会收到以过滤器设置的字节开头的消息。

    这段代码:

    int sndhwm = 0;
    sub.setsockopt(ZMQ_SUBSCRIBE, &sndhwm, sizeof(sndhwm));
    

    将过滤器设置为值为 0x00 的 sizeof(sndhwm) 字节。但是您的消息不是以这个 0x00 字节数开头的。因此,该消息被 SUB 套接字忽略。

    您应该删除 setsockopt 电话。

    如果您的意图是清除邮件过滤器,您可以使用以下方法执行此操作:

    sub.setsockopt(ZMQ_SUBSCRIBE, nullptr, 0);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-03-23
      • 2020-12-05
      • 1970-01-01
      • 1970-01-01
      • 2012-01-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多