gpt4 book ai didi

c++ - ZeroMQ - 使用 REQ 套接字发送超过 30 个字节

转载 作者:行者123 更新时间:2023-11-28 06:40:04 27 4
gpt4 key购买 nike

我很难理解如何正确使用 0MZ。当我尝试发送一条初始化大小大于 29 的消息时,出现了错误。我的代码很简单:

zmq::context_t context (1);
zmq::socket_t req(context,ZMQ_REQ);
req.connect("tcp://localhost:6969");

int msgSize = 100;
zmq::message_t test(msgSize);
snprintf((char*)test.data(),msgSize,"short message");
cout << static_cast<char*>(test.data())<< endl; // this is always fine - 'short message'

到目前为止一切顺利,但是在发送此消息后,如果 msgSize>29,我将无法再次获得相同的结果

req.send(test);
cout << static_cast<char*>(test.data())<< endl; // now it's gibberish, like '&?+#'

更令人费解的是,如果我的服务器接收到消息,它看起来也像“&?+#”,但如果它只是通过 PUB 套接字将其发回,我可以在我的客户端中再次读取它:

zmq::message_t reply;
req.recv(&reply);
cout << static_cast<char*>(test.data())<< endl; - 'my message' again!

我知道,短消息有 29 个字节的限制,但我如何在不处理多部分消息的情况下绕过它?我确实需要 40 个字符....

最佳答案

如果消息大于 30 字节,内存曾经被“测试”占用,但随后被释放,必须被回复数据重用(显然是意外发现)。因此,当您再次查看“测试”时,它神奇地出现了您认为应该的样子。这个理论应该非常简单,您可以通过查看地址在调试器中进行验证。

无论如何,正如 Hristo 所说,发送消息会释放其原始内容,不应再次使用。

ZeroMQ 对不需要单独分配负载的小消息进行了优化。同样,发送消息后您仍然可以看到您期望的内容这一事实只是人为现象;你不能依赖它。

如果您需要在消息发送后保留消息的内容,请查看 ZMQ 4.0 新增的 zmq_send_const()。我不知道是否有任何绑定(bind)使用它。

关于c++ - ZeroMQ - 使用 REQ 套接字发送超过 30 个字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26135646/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com