Zeromq: как получить доступ к tcp-сообщению в c ++

Я новичок в ZeroMQ и пробираюсь через пример приветственного мира C ++ шаблона echo клиент-сервер (Request-Reply). Сервер выглядит так:

//
// Hello World server in C++
// Binds REP socket to tcp://*:5555
// Expects "Hello" from client, replies with "World"
//
#include <zmq.hpp>
#include <string>
#include <iostream>
#include <unistd.h>

int main () {
    // Prepare our context and socket
    zmq::context_t context (1);
    zmq::socket_t socket (context, ZMQ_REP);
    socket.bind ("tcp://*:5555");

    while (true) {
        zmq::message_t request;

        // Wait for next request from client
        socket.recv (&request);
        std::cout << "Received Hello" << std::endl;

        // Do some 'work'
        sleep (1);

        // Send reply back to client
        zmq::message_t reply (5);
        memcpy ((void *) reply.data (), "World", 5);
        socket.send (reply);
    }
    return 0;
}

Теперь мой вопрос: как я могу получить доступ / прочитать реальные данные, которые socket.recv ()? Попытка:

 std::cout << request << std::endl;

привело к сообщению об ошибке:

 error: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = 
 std::char_traits<char>](((std::basic_ostream<char, std::char_traits<char> >&)
 (& std::cout)), ((const char*)"Received Hello")) << request’

То же самое относится и к клиентской стороне, которая отправляет сообщение. Я не могу найти способ отобразить реальное сообщение ...

 dhpizza05 июн. 2012 г., 19:36
Я прочитал руководство, но, к сожалению, оно не включает в себя то, что я ищу ...
 dhpizza05 июн. 2012 г., 18:55
Вы правы, есть запись для zmq_msg_data, которая гласит: «Функция zmq_msg_data () должна возвращать указатель на содержимое сообщения объекта сообщения, на который ссылается msg.» Но как мне сделать это явно?
 Void04 нояб. 2013 г., 18:50
@ Яркс, ты прочитал руководство? Если у вас есть, то вы бы узнали, что приведенный выше код взят из руководства. Там они просто говорят "получил привет" вместо того, чтобы фактически прочитать сообщение, которое было отправлено. Я действительно пришел сюда по тому же вопросу, что и ОП.
 larsks05 июн. 2012 г., 18:39
Я считаю, что в документации ZeroMQ есть примеры на C ++. Вы смотрели на них?
 larsks05 июн. 2012 г., 19:31
Нет я имею ввидуGuide полон примеров кода C ++.

Ответы на вопрос(3)

что нам нужно пройти руководство, прежде чем мы сможем написать элегантные коды ZeroMQ. Я нашел строки простых кодов изHELLO WORLD Пример для извлечения данных, полученных из сокета и отправки ответа:

    zmq::message_t request;
    socket.recv (&request);
    std::cout << "Received request: [" << (char*) request.data() << "]" << std::endl;
    //  Do some 'work'
    Sleep (1);
    //  Send reply back to client
    zmq::message_t reply (6);
    memcpy ((void *) reply.data (), "World", 6);
    socket.send (reply);

Однако это решение не определяет длину полученных данных, следуяNikolai KoudeliaКак описано выше, я создаю строку для полученных данных:

 std::cout << "Received request: [" << std::string(static_cast<char*>(request.data()), request.size())  << "]" << std::endl;

ные значения:

std::cout << "Received Hello" << std::endl;

Печать фактического ответа может быть выполнена следующим образом:

zmq::message_t reply;
socket.recv (&reply);

std::string rpl = std::string(static_cast<char*>(reply.data()), reply.size());

std::cout << rpl << std::endl;

В zhelpers.hpp есть и другие полезные примеры.

 19 июн. 2014 г., 17:18
Очень хороший ответ!
 16 янв. 2014 г., 11:44
Да, привязка (zmq.hpp) необходима.
 10 июн. 2012 г., 10:25
Хороший первый ответ @NikolaiKoudelia.
 16 янв. 2014 г., 07:08
вы используете привязку c zmq (cppzmq) или zmq без привязки?

zmq::message_t request (msglen);
memcpy ( (void *) request.data(), myMessage, msglen);
char * requestmsg = new char [msglen];
memcpy (requestmsg, request.data(), request.size());
requestsocket.send (request);
std::cout << "Sending " <<  requestmsg << std::endl;

где msglen имеет тип int, а myMessage - const char * tyoe. Таким образом, сервер получает удобочитаемое сообщение. Надеюсь, это не против каких-либо правил ZEROMQ ...

 04 нояб. 2013 г., 18:52
Поскольку вы находитесь в C ++, почему бы не использовать строки? Я имею в виду, что char * - это просто боль, если вы действительно не нуждаетесь в них по непонятным причинам (например, в других библиотеках).

Ваш ответ на вопрос