0

我有以下代码,我正在尝试通过 ZMQ 发送一条 capnp 消息:

::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)
4

2 回答 2

2

kj::ArrayPtr来自 KJ 库,它是 Cap'n Proto 的一部分。ZeroMQ 对 KJ 一无所知,因此无法识别该类型。它要么需要message_t(ZeroMQ 类型),要么需要指针/大小组合。你可以做:

auto bytes = words.asBytes();
_publisher.send(bytes.begin(), bytes.size());
于 2016-07-30T04:21:56.020 回答
0

我没有使用 zeromq,我才刚刚开始使用 capnp,但我真的很喜欢 capnp 为通过套接字发送数据带来的简单性。

如果可以的话,当数据也被 capnp 序列化时,我会使用zeromq 上的 capnp 函数来发送和接收数据:

capnp::writeMessageToFd(fd, builder)

fd插座在哪里,builder你的建造者在哪里:message

在接收端,你可以用类似的东西等待它capnp::StreamFdMessageReader message(socket)

如果您真的想将这个东西打包成 zeromq 可以采用的格式,也许将数组转换为字节,如此处详述对于您的 zeromq 消息的构造函数来说是可以接受的。

祝你好运!

于 2016-07-29T06:55:33.707 回答