Buffer上次收到Zeromq消息作为类成员
Buffer last received ZeroMQ message as class member
我正在尝试编写一个订阅通过Zeromq发布的消息并缓冲最后一个接收的消息。
我尝试这样做如下。该方法ReceivedMessage()
应在称为函数的循环中通过包装应用程序调用。返回真实后,我尝试使用GetReceivedMessageData()
访问消息。不幸的是,似乎数据未正确保存在成员zmq_receivedMessage_
中。
我想这是因为zmq_receivedMessage_
用固定尺寸初始化,并且调用zmq_subscriber_.recv(&zmq_receivedMessage_)
不会自动调整它?
最简单,最坚固的方法是什么?我能想到的唯一方法是每次收到新消息时使用realloc()
和memcpy()
。还是有更简单的方法?
#include <cstdint>
#include "zeromq_cpp/zmq.hpp"
class HandlerClass
{
public:
/// @brief Initializes a AirSimToRos class instance.
HandlerClass(std::string const& addr);
// @brief Gets the message data received via ZeroMq as pointer.
void* GetReceivedMessageData();
// @brief Gets the message size received via ZeroMq as size_t.
std::size_t GetReceivedMessageSize();
// @brief Returns true if a new, full message was received via ZeroMq, false otherwise
bool ReceivedMessage();
private:
/// @brief A ZeroMq context object encapsulating functionality dealing with the initialisation and termination.
zmq::context_t zmq_context_;
/// @brief A ZeroMq socket for subscribing to incoming messages.
zmq::socket_t zmq_subscriber_;
/// @brief A ZeroMq message that was received last. Might be empty if ReceivedMessage() never was true.
zmq::message_t zmq_receivedMessage_;
};
HandlerClass::HandlerClass(std::string const& addr)
: zmq_context_(1)
, zmq_subscriber_(zmq_context_, ZMQ_SUB)
{
zmq_subscriber_.setsockopt(ZMQ_IDENTITY, "HandlerSubscriber", 5);
zmq_subscriber_.setsockopt(ZMQ_SUBSCRIBE, "", 0);
zmq_subscriber_.setsockopt(ZMQ_RCVTIMEO, 5000);
zmq_subscriber_.connect(addr);
}
void* HandlerClass::GetReceivedMessageData()
{
return zmq_receivedMessage_.data();
}
std::size_t HandlerClass::GetReceivedMessageSize()
{
return zmq_receivedMessage_.size();
}
bool HandlerClass::ReceivedMessage()
{
int received_bytes = zmq_subscriber_.recv(&zmq_receivedMessage_);
return received_bytes > 0;
}
一种方法是重新设计W/ Poller
-instance ZMQ_CONFLATE
具有预期类用例的零上下文,原始设计似乎是数据移动的"机械"包装器,而不是任何MVP-SLIM设计,可以最大程度地挤压Zeromq可扩展的好处正式的通信原型信号/消息传递框架已经内置。
更聪明的(以及ZMQ_RCV_HWM
-SAFER(超出了本主题的范围))将不只是总是机械地从Zeromq Context
-控制范围内机械读取每个消息,除非实际需要重新读取从 HandlerClass
传输此类数据。
添加 Poller
的private
实例,该实例将允许使用.poll()
-Method来测试新消息到达(也有一个真实的(也有一个真实) - 时间/事件处理循环稳定控制工具,不要等待更长的时间比临时设置.poll()
-Method超时),但仍能够尽可能迟迟推迟任何实际数据移动,直到数据确实需要外部流出 HandlerClass
-instance,不早于任何地方。
HandlerClass::HandlerClass(std::string const& addr)
: zmq_context_(1)
, zmq_subscriber_(zmq_context_, ZMQ_SUB)
{
zmq_subscriber_.setsockopt( ZMQ_IDENTITY, "HandlerSubscriber", 5 );
zmq_subscriber_.connect( addr );
zmq_subscriber_.setsockopt( ZMQ_SUBSCRIBE, "", 0 );
zmq_subscriber_.setsockopt( ZMQ_LINGER, 0 ); // ALWAYS, READY 4 .term()
zmq_subscriber_.setsockopt( ZMQ_CONFLATE, 1 ); // SMART
zmq_subscriber_.setsockopt( ZMQ_TOS, T ); // WORTH DEPLOY & MANAGE
zmq_subscriber_.setsockopt( ZMQ_RCVTIMEO, 5000 );
// ------------------------------------------------- // ADD Poller-instance
...
// ------------------------------------------------- // RTO
}
nota bene:如果在Zeromq基础架构上还进行了前gress流,则有节省时间的API工具,用于零填充消息,将其重新填充到另一个Zeromq socket-transport中 - (几乎几乎几乎)免费 - 很酷,不是吗?
- 将成员变量添加到共享库中的类中,不会破坏二进制兼容性吗
- 对RValue对象调用的LValue ref限定成员函数
- boost::进程间消息队列引发错误
- 为什么使用 "this" 指针调用派生成员函数?
- 具有奇怪重复模板模式的派生类中的成员变量已损坏
- 助记符和指向成员语法的指针
- 用于访问容器<T>数据成员的正确 API
- C++错误消息*成员参考.**初学者*
- 线程消息传递或更好:在"大师班"中访问其他班级的成员
- 将类成员函数作为线程调用到另一个类成员函数时发出警告消息
- 重构MFC消息映射以包括完全限定的成员函数指针
- 带有指向成员函数的指针的模板 =VC++ 2017 和 gcc 5.1 的>不同的错误消息
- 为什么调用单例类 Qt 消息处理程序成员函数会出现错误:缺少参数列表
- Buffer上次收到Zeromq消息作为类成员
- 如何函数<void(字符串消息)>绑定到成员函数?
- 如何获取/实现类的内置类型成员变量"Uninitialized uses warning"消息?
- 接收sensor_msgs::将图像作为ros消息中的数据成员
- C++,在尝试创建类时收到此消息:错误:没有在类“media”中声明的“void media::*()”成员函数
- 错误的编译器错误消息:size_t不是std的成员
- 将用于串行通信的消息存储为c++可行的成员变量