10 #include <mrpt/core/exceptions.h>
12 #if defined(MVSIM_HAS_ZMQ) && defined(MVSIM_HAS_PROTOBUF)
13 #include <google/protobuf/message.h>
18 using namespace mvsim;
20 void mvsim::sendMessage(
const google::protobuf::MessageLite& m, zmq::socket_t& socket)
22 mrpt::io::CMemoryStream buf;
23 auto arch = mrpt::serialization::archiveFrom(buf);
25 arch << m.GetTypeName();
26 arch << m.SerializeAsString();
28 zmq::message_t msg(buf.getRawBufferData(), buf.getTotalBytesCount());
29 #if CPPZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 1)
30 socket.send(msg, zmq::send_flags::none);
36 std::tuple<std::string, std::string> mvsim::internal::parseMessageToParts(
const zmq::message_t& msg)
38 mrpt::io::CMemoryStream buf;
39 buf.assignMemoryNotOwn(msg.data(), msg.size());
41 auto arch = mrpt::serialization::archiveFrom(buf);
43 std::string typeName, serializedData;
44 arch >> typeName >> serializedData;
45 return {typeName, serializedData};
48 void mvsim::parseMessage(
const zmq::message_t& msg, google::protobuf::MessageLite& out)
50 const auto [typeName, serializedData] = internal::parseMessageToParts(msg);
52 ASSERT_EQUAL_(typeName, out.GetTypeName());
54 bool ok = out.ParseFromString(serializedData);
57 "Format error: protobuf could not decode binary message of "
63 zmq::message_t mvsim::receiveMessage(zmq::socket_t& s)
66 #if CPPZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 1)
67 std::optional<size_t> msgSize =
s.recv(m);
68 ASSERT_(msgSize.has_value());
75 std::string mvsim::get_zmq_endpoint(
const zmq::socket_t& s)
77 #if CPPZMQ_VERSION > ZMQ_MAKE_VERSION(4, 7, 0)
78 return s.get(zmq::sockopt::last_endpoint);
80 char assignedPort[200];
81 size_t assignedPortLen =
sizeof(assignedPort);
82 s.getsockopt(ZMQ_LAST_ENDPOINT, &assignedPort, &assignedPortLen);
83 assignedPort[assignedPortLen] =
'\0';
84 return {assignedPort};