2016-07-28 29 views
0

Ich habe den folgenden Code, und ich versuche, eine capnp Nachricht über ZMQ senden an:kann nicht capnp Nachrichten über 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); 

Ich bin mit dem Publish-Subscribe-Muster & Ich erhalte die folgende Fehlermeldung:

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) 

Antwort

0

ich habe nicht verwendet zeromq, und ich fange gerade erst capnp zu verwenden, aber ich genieße die Einfachheit, dass capnp auf das Senden von Daten über die Buchse bringt.

würde ich capnp functions über zeromq verwenden, um Daten zu senden und empfangen, wenn diese Daten auch von capnp serialisiert wird, wenn Sie können:

capnp::writeMessageToFd(fd, builder)

wo fd ist die Buchse und builder ist Ihr Erbauer: message

Auf der Empfängerseite können Sie mit etwas wie capnp::StreamFdMessageReader message(socket)

warten, wenn Sie wirklich wollte dieses Ding in ein Format packen, das zeromq nehmen könnte, vielleicht konvertiert das Array in Bytes, wie detailliert here, wird für den Konstruktor Ihrer zeromq Nachricht akzeptabel sein.

Viel Glück!

+0

Ich habe kj :: ArrayPtr Bytes = words.asBytes(); _ publisher.send (Bytes); Ich bekomme immer noch einen ähnlichen Fehler: keine bekannte Konvertierung von 'kj :: ArrayPtr ' zu 'zmq :: message_t &' @Ditofry – nik

1

kj::ArrayPtr stammt aus der KJ-Bibliothek, die Teil von Cap'n Proto ist. ZeroMQ weiß nichts über KJ und wird diesen Typ nicht erkennen. Entweder ein message_t (ein ZeroMQ-Typ) oder ein Zeiger/Größe-Kombination. Sie tun können:

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

Vielen Dank @Kenton Varda. Ich schätze deine Hilfe sehr :) . – nik