Как я могу получать составные сообщения с ZeroMQ? - PullRequest
4 голосов
/ 01 июня 2011

Я не могу получить оболочку ZeroMQ C ++ для получения составных сообщений. Тот же код, использующий версию C, прекрасно работает, но приводит к исключению без объяснений с C ++. Код многоэтапной обработки выглядит следующим образом:

int _tmain(int argc, _TCHAR* argv[])
{
    zmq::context_t context(1);
    zmq::socket_t socket(context, ZMQ_REP);
    socket.bind("tcp://*:5555");

    while(true) {
        // the following two lines lead to exception
        zmq::message_t request;
        socket.recv(&request);

        //zmq_msg_t message;
        //zmq_msg_init (&message);
        //zmq_recv (socket, &message, 0);   
    }

    return 0;
}

Это чрезвычайно просто; эта версия не работает. но если я закомментирую первые две строки в цикле while и раскомментирую закомментированный в данный момент код (версия C), это сработает. Это Windows XP sp3, Zeromq 2.1.1 и Visual Studio 2010 Express.

Если я отправляю отдельные сообщения, обе версии работают нормально. Что я делаю неправильно?

Ответы [ 2 ]

2 голосов
/ 12 сентября 2011

Возможно, C-версия кода тоже не работает, но вы не проверяете код возврата zmq_recv, поэтому не замечаете этого. Кроме того, при получении сообщений miltipart вы должны проверить, есть ли еще части сообщения, которые будут получены через сокет, например:

int64_t more = 0;
size_t more_size = sizeof(more);
socket.getsockopt(ZMQ_RCVMORE, &more, &more_size);
if (more != 0)
{
  //has more parts
}

Кроме того, взгляните на библиотеку ZmqMessage C ++ , разработанную специально для отправки и получения составных сообщений ZeroMQ.

0 голосов
/ 12 июня 2011

Я решил использовать C версию кода.В общем, все примеры, кажется, все равно на C.

...