2016-07-28 74 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

我加入KJ :: 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