ZeroMQ, XSUB не получает

Я реализовал одну сеть издателя и одну сеть подписчиков, используя 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? Если я заменю XSUB на SUB, это сработает. Однако тогда я не могу выполнить команду subscribe.send(msg) в коде.


person Max Li    schedule 06.07.2014    source источник


Ответы (1)


вместо использования setsockopt для подписки вам нужно использовать send и первый байт сообщения должен быть 1.

в вашем случае отправьте переменную фильтра, но добавьте байт в начало фильтра со значением 1 (не ascci '1', просто 1).

person somdoron    schedule 06.07.2014