2016-07-28 3 views
0

У меня есть следующий код, и я пытаюсь отправить сообщение 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) 

ответ

0

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

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

capnp::writeMessageToFd(fd, builder)

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

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

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

Удачи вам!

+0

Я добавил кДж :: ArrayPtr байт = words.asBytes(); _ publisher.send (байт); Я по-прежнему получаю аналогичную ошибку: неизвестное преобразование из 'kj :: ArrayPtr ' в 'zmq :: message_t &' @Ditofry – nik

1

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

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

Большое спасибо @ Kenton Varda. Я очень ценю вашу помощь :) . – nik

Смежные вопросы