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(
21 const google::protobuf::MessageLite& m, zmq::socket_t& socket)
23 mrpt::io::CMemoryStream buf;
24 auto arch = mrpt::serialization::archiveFrom(buf);
26 arch << m.GetTypeName();
27 arch << m.SerializeAsString();
29 zmq::message_t msg(buf.getRawBufferData(), buf.getTotalBytesCount());
30 #if CPPZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 1) 31 socket.send(msg, zmq::send_flags::none);
37 std::tuple<std::string, std::string> mvsim::internal::parseMessageToParts(
38 const zmq::message_t& msg)
40 mrpt::io::CMemoryStream buf;
41 buf.assignMemoryNotOwn(msg.data(), msg.size());
43 auto arch = mrpt::serialization::archiveFrom(buf);
45 std::string typeName, serializedData;
46 arch >> typeName >> serializedData;
47 return {typeName, serializedData};
50 void mvsim::parseMessage(
51 const zmq::message_t& msg, google::protobuf::MessageLite& out)
53 const auto [typeName, serializedData] = internal::parseMessageToParts(msg);
55 ASSERT_EQUAL_(typeName, out.GetTypeName());
57 bool ok = out.ParseFromString(serializedData);
60 "Format error: protobuf could not decode binary message of " 66 zmq::message_t mvsim::receiveMessage(zmq::socket_t& s)
69 #if CPPZMQ_VERSION >= ZMQ_MAKE_VERSION(4, 3, 1) 70 std::optional<size_t> msgSize = s.recv(m);
71 ASSERT_(msgSize.has_value());
78 std::string mvsim::get_zmq_endpoint(
const zmq::socket_t& s)
80 #if CPPZMQ_VERSION > ZMQ_MAKE_VERSION(4, 7, 0) 81 return s.get(zmq::sockopt::last_endpoint);
83 char assignedPort[200];
84 size_t assignedPortLen =
sizeof(assignedPort);
85 s.getsockopt(ZMQ_LAST_ENDPOINT, &assignedPort, &assignedPortLen);
86 assignedPort[assignedPortLen] =
'\0';
87 return {assignedPort};