Невозможно отправить сообщения capnp через ZMQ

У меня есть следующий код, и я пытаюсь отправить сообщение capnp через ZMQ:

::capnp::MallocMessageBuilder message;    
Guitar::Builder guitar = message.initRoot<Guitar>();  
guitar.setModel(1); 
guitar.setPrice(1200);

kj::Array<capnp::word> words = messageToFlatArray(message);

_publisher.send(words);

Я использую шаблон публикации-подписки и получаю следующую ошибку:

error: no matching member function for call to  
      'send'  
        _publisher.send(words);  
        ~~~~~~~~~~~^~~~ /usr/local/include/zmq.hpp:610:21: note: candidate function not viable: no known conversion from  
'kj::Array<capnp::word>' to  
      'zmq::message_t &' for 1st argument  
        inline bool send (message_t &msg_, int flags_ = 0)  
                    ^ /usr/local/include/zmq.hpp:627:21: note: candidate   function not viable: no known conversion from
'kj::Array<capnp::word>' to
      'zmq::message_t' for 1st argument
        inline bool send (message_t &&msg_, int flags_ = 0)
                    ^ /usr/local/include/zmq.hpp:620:35: note: candidate function template not viable: requires at least 2 arguments,
but 1 was
      provided
        template<typename I    bool send(I first, I last, int flags_=0)
                                  ^ /usr/local/include/zmq.hpp:600:23: note: candidate function not viable: requires at least 2 arguments,
but 1 was provided
        inline size_t send (const void *buf_, size_t len_, int flags_ = 0)

2 ответа

kj::ArrayPtr это из библиотеки KJ, которая является частью Cap'n Proto. ZeroMQ ничего не знает о KJ, поэтому не распознает этот тип. Либо хочет message_t (тип ZeroMQ) или комбинация указатель / размер. Ты можешь сделать:

auto bytes = words.asBytes();
_publisher.send(bytes.begin(), bytes.size());

Я не использовал zeromq, и я только начинаю использовать capnp, но мне действительно нравится простота, которую capnp приносит для отправки данных через сокет.

Я бы использовал функции capnp через zeromq для отправки и получения данных, когда эти данные также сериализуются с помощью capnp, если вы можете:

capnp::writeMessageToFd(fd, builder)

где fd это розетка и builder Ваш строитель: message

На приемном конце вы можете ждать его с чем-то вроде capnp::StreamFdMessageReader message(socket)

Если вы действительно хотите упаковать эту вещь в формат, который может принять zeromq, возможно, преобразование массива в байты, как подробно описано здесь, будет приемлемым для конструктора вашего сообщения zeromq.

Удачи!

Другие вопросы по тегам