【问题标题】:ZeroMQ, XSUB does not receiveZeroMQ,XSUB 收不到
【发布时间】:2014-07-07 00:25:46
【问题描述】:

我已经使用 ZeroMQ 实现了一个发布者和一个订阅者网络。我使用了 XPUB 和 XSUB,因为我希望订阅者也能够向发布者发送数据。我的代码适用于 XPUB + SUB,这意味着订阅者可以从发布者那里接收数据。但是,它不适用于 XPUB + XSUB。这可能是因为我不能执行“setsockopt(ZMQ_SUBSCRIBE, ... )”。我总是在运行时收到“无效参数”错误。这是我的代码:

/*  Code  */
zmq::context_t context (1);

//  Socket to talk to server
std::cout << "Collecting updates from weather server...\n" << std::endl;
zmq::socket_t subscriber (context, ZMQ_XSUB);
subscriber.connect("tcp://localhost:5556");

char *filter = "10001 ";
subscriber.setsockopt(ZMQ_SUBSCRIBE, filter, strlen (filter));
/*
zmq::message_t msg(10);
sprintf ((char *) msg.data(), "%05d %d %d", 1, 2, 3);
std::cout << "To Send from SUB" << std::endl;
subscriber.send(msg);
std::cout << "Send from SUB" << std::endl;
*/
//  Process 100 updates
int update_nbr;
long total_temp = 0;
for (update_nbr = 0; update_nbr < 10; update_nbr++) {

    zmq::message_t update;
    int zipcode, temperature, relhumidity;

    subscriber.recv(&update);

    std::istringstream iss(static_cast<char*>(update.data()));
    iss >> zipcode >> temperature >> relhumidity ;

    total_temp += temperature;
}
std::cout   << "Average temperature for zipcode '"
            <<"' was "<<(int) (total_temp / update_nbr) <<"F"
            << std::endl;

我设置subscriber.setsockopt 的方式有什么问题?如果我用 SUB 替换 XSUB,它就可以工作。但是,我不能在代码中执行 subscribe.send(msg)。

【问题讨论】:

    标签: zeromq setsockopt


    【解决方案1】:

    您需要使用 send 而不是使用 setsockopt 订阅,并且消息的第一个字节应该是 1。

    在您的情况下发送过滤器变量,但在过滤器的开头附加一个字节,值为 1(不是 ascci '1',只是 1)。

    【讨论】:

      猜你喜欢
      • 2015-04-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-03
      • 2017-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多