- Java锁的逻辑(结合对象头和ObjectMonitor)
- 还在用饼状图?来瞧瞧这些炫酷的百分比可视化新图形(附代码实现)⛵
- 自动注册实体类到EntityFrameworkCore上下文,并适配ABP及ABPVNext
- 基于Sklearn机器学习代码实战
消息分片允许将多个消息封装成一条消息。在发送自定义协议数据时,我们经常需要在消息前“填充”一个包头。如下代码,在发送的时候加上 zmq::send_flags::sndmore 标识(对应 zeromq ZMQ_SNDMORE ),表示后面还有消息。这样 zeromq 会将 ZMQ_SNDMORE 的消息和最后一段消息拼装成一条完整的消息发送.
int SendData(char* pMsg, int iMsgLen)
{
tagMsgHead stHead;
bzero(&stHead, sizeof(stHead));
...
stHead.Len = iMsgLen;
stHead.Crc = 0;
try
{
m_socket.send(zmq::const_buffer((const void*)(&stHead), sizeof(stHead)),zmq::send_flags::dontwait|zmq::send_flags::sndmore);
m_socket.send(zmq::const_buffer((const void*)(pMsg), static_cast<size_t>(iMsgLen)), zmq::send_flags::dontwait);
}
catch (...)
{
....
}
return 0;
}
需要注意的是,如果发送使用了 ZMQ_SNDMORE 分片,那么在接收时也需要分多次 recv 接收数据(这点比较麻烦)。开始的时候以为 recv 接收的是一个完成的包,后面才知道 recv 接收的其实是“帧”数据,多个“帧”拼装成一个消息。具体接收方法如下:
Buffer buffer;
while (1) {
// 接收消息
zmq_msg_t identify;
zmq_msg_t message;
zmq_msg_init(&identify);
zmq_msg_init(&message);
zmq_recvmsg(socket, &identify, 0);
zmq_recvmsg(socket, &message, 0);
buffer.Append(zmq_msg_data(&message), zmq_msg_size(&message));
// 检查是否还有更多消息可读
while(zmq_msg_more(&message)) {
zmq_recvmsg(socket, &message, 0);
buffer.Append(zmq_msg_data(&message), zmq_msg_size(&message));
}
zmq_msg_close(&identify);
zmq_msg_close(&message);
}
使用 cppzmq 的话,代码如下:
Buffer buffer;
while (1) {
// 接收消息
zmq::message_t identity;
zmq::message_t message;
socket.recv(identity, zmq::recv_flags::none);
socket.recv(message, zmq::recv_flags::none);
buffer.Append(message.data(), message.size());
// 检查是否还有更多消息可读
while(message.more()) {
socket.recv(message, zmq::recv_flags::none);
buffer.Append(message.data(), message.size());
}
}
使用 ZMQ_SNDMORE 后接收也需要分片接收,这个确实是比较麻烦的地方。个人觉得如果改成一次接收会更好,因为这样更符合使用的“直觉”.
后面会不断更新这部分,有新的问题会加进来.
最后此篇关于近期调研和使用zeromq与cppzmq的一些问题的文章就讲到这里了,如果你想了解更多关于近期调研和使用zeromq与cppzmq的一些问题的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
我正在尝试使用 ZMQ与 CPPZMQ C++ 包装器,它似乎是 C++ Bindings 中建议的包装器. 客户端/服务器(REQ/REP)似乎工作正常。当尝试实现一对发布/订阅程序时,第一条消息似
我在示例发布器中使用了两个主题。两者都以相同的字符串开头。当我仅使用两个主题之一过滤订阅者中的消息时,订阅者会收到这两个主题 如果我使用两个不同的主题,它就可以工作 我的示例发布商 try (ZCon
在 C++ ZMQ Publisher 中,我将字符串打包到 message_t 中,如下所示: int main() { zmq::context_t context(1); z
以下服务器和客户端代码是 the official tutorial 的略微修改版本.我对他们的输出的解释是,无论他们发送或接收什么,总是 1 个字节。怎么会这样? 服务器.cpp: #include
我把这个最小的例子放在一起,以便将消息从路由器套接字发送到特定的 DEALER socker(它有它的身份集)。当运行这两个程序时,它似乎卡在 ROUTER 上等待来自 DEALER 的回复,而 DE
我的用例通常只涉及一个全局上下文。据我所知,pyzmq 有一个 API zmq.Context.instance() 来获取全局单例,但我找不到等效的 cppzmq API。 是否可以访问全局上下文而
在Linux-Ubuntu上安装ZeroMQ,一个网站 https://tuananh.org/2015/06/16/how-to-install-zeromq-on-ubuntu/ 说要运行以下命令
我是一名优秀的程序员,十分优秀!