Обмен сообщениями с нулевой копией с помощью zmqpp

#zeromq

#zeromq

Вопрос:

Обмен сообщениями с нулевой копией — это то, что может быть реализовано в zeromq, но возможно ли использовать его с привязками zmqpp c ? Документации почти нет, и я не смог ничего найти в примерах…

Комментарии:

1. Какую привязку C вы используете? cppzmq? В общем, C должен вводить несколько ограничений, если таковые вообще имеются, по сравнению с тем, чего вы можете достичь в обычном C с помощью ZMQ. Ключом к получению нулевой копии в C, по-видимому, является zmq_msg_init_data метод, который, по-видимому, свободно обернут в привязки C , которые я рассмотрел, так что, похоже, вы должны добиться успеха, исследуя этот путь.

2. Я только что увидел, что вы упомянули конкретно привязки zmqpp, позвольте мне посмотреть, что я вижу…

3. Хорошо, я собираюсь оставить это в комментариях, поскольку у меня нет окончательного ответа на ваш вопрос, но единственная ссылка в выбранной вами привязке к zmq_msg_init_data находится в frame.cpp — но быстрый просмотр кодовой базы не показывает ничего, что инициализирует фрейм с этой подписью, так что, похоже, вам придется выполнить некоторое ручное построение фреймов сообщений, чтобы сделать то, что вам нужно, но это должно быть возможно.

4. Не ответ, но если вы не слишком далеко продвинулись в проекте, я бы переключился на cppzmq. Это более активный проект, который поддерживается некоторыми основными специалистами libzmq. Только его заголовок и поддерживает нулевое копирование. github.com/zeromq/cppzmq

5. @JamesHarvey, да, спасибо, мне не очень нравится zmqpp. Очень мало документации, похоже, что она не поддерживается должным образом… Я все равно не понимаю, почему на странице проекта zeromq на github есть две разные привязки к c …

Ответ №1:

Я бы переключился на cppzmq.

Это более активный проект, который поддерживается некоторыми основными специалистами libzmq.

Это только заголовок и поддерживает нулевое копирование.

Ответ №2:

Просто используйте zmqpp::message::copy().

В исходном коде zmqpp мы можем видеть:

 void message::copy(message constamp; source)
{
    _parts.resize( source._parts.size() );
    for(size_t i = 0; i < source._parts.size();   i)
    {
        _parts[i] = source._parts[i].copy();
    }

    // we don't need a copy of the releasers as we did data copies of the internal data,
    //_releasers = source._releasers;
    //_strings = source._strings
}
  

_parts, которые определены как:

 private:
    typedef std::vector<frame> parts_type;
    parts_type _parts;
  

итак, исходный код._parts[i].copy() на самом деле вызывает zmqpp::frame::copy(), который определен здесь:

 frame frame::copy() const
{
    frame other( size() );
    other._sent = _sent;

    if( 0 != zmq_msg_copy( amp;other._msg, const_cast<zmq_msg_t*>(amp;_msg) ) )
    {
        throw zmq_internal_exception();
    }

    return other;
}
  

zmqpp::frame::_msg во фрагменте кода определяется как zmq_msg_t. Все объекты zmq_msg_t в объектах фрейма исходного объекта zmqpp::message были скопированы zmq_msg_copy с нулевым копированием в новый объект zmqpp::message.

итак, zmqpp::message::copy() поможет нам получить новый объект zmqpp::message, весь фрейм которого равен нулю, скопированный из исходного объекта zmqpp:: message.