我正在使用 zmq 发送消息,并且在我的函数中,当我退出循环时,由于某种原因接受响应,第 8 个值似乎总是飙升至一个疯狂的高随机数。
我尝试使用计数来查看值的变化。当我在将其推入消息后检查部分的大小(并将其与循环内的向量进行比较)时,它似乎正常并且所有值都是预期的,但是一旦它退出 do while 循环,我就会迭代消息向量仅更改第 8 个值,但对于第 8 个值之后的所有内容都是正确的。我试图确保所有未使用的消息都已关闭,但我不太确定它们会如何改变任何内容。我还检查了发送的消息是否正确,但我很困惑。
int more;
size_t more_size = sizeof(more);
std::vector<zmq_msg_t> messages;
int counter = 0;
do {
zmq_msg_t part;
rc = zmq_msg_init(&part);
rc = zmq_msg_init_size(&part, CHUNK_SIZE);
/* Block until a message is available to be received from socket */
rc = zmq_msg_recv(&part, clientSocket_, 0);
assert(rc != -1);
// Add the string to the vector
messages.push_back(part);
/* Determine if more message parts are to follow */
rc = zmq_getsockopt(clientSocket_, ZMQ_RCVMORE, &more, &more_size);
assert(rc == 0);
zmq_msg_close(&part);
} while (more);
for (zmq_msg_t msg : messages) {
std::cout << "message size: " << zmq_msg_size(&msg) << std::endl;
}
输出如下。
message size: 1024
message size: 1024
message size: 1024
message size: 1024
message size: 1024
message size: 1024
message size: 1024
message size: 139644284960912
message size: 1024
... (keeps going)
这只是一个包装类的简单草图——我还没有尝试过,因为我什至没有可用的库。您应该仍然能够理解这个想法,并可能修复无法按预期工作的问题。
class MyZmsg
{
public:
std::unique_ptr<zmq_msg_t> message;
public:
MyZmsg()
{
auto msg=std::make_unique<zmq_msg_t>();
if (zmq_msg_init(msg.get())!=0) throw std::bad_alloc();
message=std::move(msg);
}
~MyZmsg()
{
if (message) zmq_msg_close(message.get());
}
operator zmq_msg_t*() const noexcept
{
return message.get();
}
};
这应该是可移动的,但不可复制(因为
unique_ptr
),因此您可以将其粘贴到vector
中。它已经为您完成了初始化/关闭操作,并且转换运算符应该允许您仅使用此实例而不是 &part
。