我使用ZeroMQ实现了一个发布者和一个订阅者网络。我使用XPUB和XSUB,因为我希望订阅者也能够向发布者发送数据。我的代码适用于XPUB + SUB,这意味着订阅者可以从发布者接收数据。但是,它不适用于XPUB + XSUB。这可能是因为我不能做" setsockopt(ZMQ_SUBSCRIBE,...)"。我总是得到#34;无效的论点"运行时出错。这是我的代码:
/* 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)。
答案 0 :(得分:2)
而不是使用setsockopt进行订阅,您需要使用send,并且消息的第一个字节应为1.
在你的情况下发送过滤器变量,但是在过滤器的开头附加一个字节,值为1(不是ascci'1',只是1)。