ZeroMQ 多部分消息第二部分 0 大小
ZeroMQ Multipart message second part 0 size
我正在尝试使用 ZMQ 4.2.3 和 cppzmq 中的 sub/pub 模式接收多部分消息我能够成功发送和接收单部分消息但是当我尝试阅读第二帧它的大小始终为 0。让我完全困惑的是使用 NetMQ 的 C# 版本读取第二帧没有问题,让我相信它被正确发送。我知道我遗漏了一些东西,但今天是我试图找出没有成功的原因的第二天。
这是我的酒吧代码
#include <iostream>
#include "zmq_addon.hpp"
void main()
{
zmq::context_t ctx = zmq::context_t();
zmq::socket_t pub = zmq::socket_t(ctx, zmq::socket_type::pub);
try
{
//binding using localhost gives an error about invalid device?
pub.bind("tcp://*:8845");
}
catch (...)
{
std::cout << zmq_strerror(zmq_errno());
std::cin.get();
return;
}
byte topic = 8;
std::string id = "ragefire.bob";
while (true)
{
std::cout << "Spam\n";
pub.send(id.c_str(), id.length(), ZMQ_SNDMORE);
pub.send("foo", 3);
}
}
还有我的 C++ 子代码
#include <iostream>
#include "zmq_addon.hpp"
int main()
{
zmq::context_t ctx = zmq::context_t();
zmq::socket_t sub = zmq::socket_t(ctx, zmq::socket_type::sub);
sub.connect("tcp://localhost:8845");
std::string id = "ragefire.bob";
sub.setsockopt(ZMQ_SUBSCRIBE, id.c_str(), id.length());
while (true)
{
zmq::message_t msg;
if(sub.recv(&msg,ZMQ_NOBLOCK))
{
auto rpl = std::string(static_cast<char*>(msg.data()), msg.size());
std::cout << "Recv returned true! " << rpl << "\n";
int more;
auto more_size = sizeof(more);
sub.getsockopt(ZMQ_RCVMORE, &more, &more_size);
while (more)
{
zmq::message_t moreMsg;
sub.recv(&msg);
std::string moreRpl = std::string(static_cast<char*>(moreMsg.data()), moreMsg.size());
std::cout << "There's more! " << moreRpl << "Size is " << moreMsg.size() << "\n";
sub.getsockopt(ZMQ_RCVMORE, &more, &more_size);
}
}
else
std::cout << "Recv returned false! " << zmq_strerror(zmq_errno()) << "\n";
}
}
输出为
Recv returned true! ragefire.bob
There's more! Size is 0
为了完整起见,我的 NetMQ sub 可以读取两个帧
static void Main()
{
SubscriberSocket sub = new SubscriberSocket("tcp://localhost:8845");
sub.SubscribeToAnyTopic();
while (true)
{
NetMQMessage msg = sub.ReceiveMultipartMessage();
Console.WriteLine($"Received! {Encoding.ASCII.GetString(msg.First.Buffer)}");
Console.WriteLine($"Received! {Encoding.ASCII.GetString(msg[1].Buffer)}");
}
}
您对 sub.recv()
的初始调用正在 &msg
中接收消息,这很好。
您随后拨打 sub.recv()
的电话也接到了 &msg
,但您随后报告的是 moreMsg
。如果你真的想保留第二个message_t
,做
sub.recv(&moreMsg);
我正在尝试使用 ZMQ 4.2.3 和 cppzmq 中的 sub/pub 模式接收多部分消息我能够成功发送和接收单部分消息但是当我尝试阅读第二帧它的大小始终为 0。让我完全困惑的是使用 NetMQ 的 C# 版本读取第二帧没有问题,让我相信它被正确发送。我知道我遗漏了一些东西,但今天是我试图找出没有成功的原因的第二天。
这是我的酒吧代码
#include <iostream>
#include "zmq_addon.hpp"
void main()
{
zmq::context_t ctx = zmq::context_t();
zmq::socket_t pub = zmq::socket_t(ctx, zmq::socket_type::pub);
try
{
//binding using localhost gives an error about invalid device?
pub.bind("tcp://*:8845");
}
catch (...)
{
std::cout << zmq_strerror(zmq_errno());
std::cin.get();
return;
}
byte topic = 8;
std::string id = "ragefire.bob";
while (true)
{
std::cout << "Spam\n";
pub.send(id.c_str(), id.length(), ZMQ_SNDMORE);
pub.send("foo", 3);
}
}
还有我的 C++ 子代码
#include <iostream>
#include "zmq_addon.hpp"
int main()
{
zmq::context_t ctx = zmq::context_t();
zmq::socket_t sub = zmq::socket_t(ctx, zmq::socket_type::sub);
sub.connect("tcp://localhost:8845");
std::string id = "ragefire.bob";
sub.setsockopt(ZMQ_SUBSCRIBE, id.c_str(), id.length());
while (true)
{
zmq::message_t msg;
if(sub.recv(&msg,ZMQ_NOBLOCK))
{
auto rpl = std::string(static_cast<char*>(msg.data()), msg.size());
std::cout << "Recv returned true! " << rpl << "\n";
int more;
auto more_size = sizeof(more);
sub.getsockopt(ZMQ_RCVMORE, &more, &more_size);
while (more)
{
zmq::message_t moreMsg;
sub.recv(&msg);
std::string moreRpl = std::string(static_cast<char*>(moreMsg.data()), moreMsg.size());
std::cout << "There's more! " << moreRpl << "Size is " << moreMsg.size() << "\n";
sub.getsockopt(ZMQ_RCVMORE, &more, &more_size);
}
}
else
std::cout << "Recv returned false! " << zmq_strerror(zmq_errno()) << "\n";
}
}
输出为
Recv returned true! ragefire.bob
There's more! Size is 0
为了完整起见,我的 NetMQ sub 可以读取两个帧
static void Main()
{
SubscriberSocket sub = new SubscriberSocket("tcp://localhost:8845");
sub.SubscribeToAnyTopic();
while (true)
{
NetMQMessage msg = sub.ReceiveMultipartMessage();
Console.WriteLine($"Received! {Encoding.ASCII.GetString(msg.First.Buffer)}");
Console.WriteLine($"Received! {Encoding.ASCII.GetString(msg[1].Buffer)}");
}
}
您对 sub.recv()
的初始调用正在 &msg
中接收消息,这很好。
您随后拨打 sub.recv()
的电话也接到了 &msg
,但您随后报告的是 moreMsg
。如果你真的想保留第二个message_t
,做
sub.recv(&moreMsg);