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

时间:2014-10-01 06:51:45

标签: c++ sockets zeromq

我很难理解如何正确使用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&gt; 29,我再也无法获得相同的结果

req.send(test);
cout << static_cast<char*>(test.data())<< endl; // now it's gibberish, like '&?+#'
更令人费解的是,如果我的服务器收到消息,它看起来也像'&amp;?+#'那样,但如果它只是用PUB套接字发回它,我可以在我的客户端再次读取它:

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

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

2 个答案:

答案 0 :(得分:1)

如果消息是&gt; 30个字节,内存一旦被'test'占用,但随后被释放,必须被回复数据重复使用(显然是由于偶然性)。因此,当你再次看到'测试'时,它神奇地看起来就像你认为的那样。这个理论应该非常简单,您可以通过查看地址在调试器中进行验证。

无论如何,正如Hristo所说,发送信息可以释放它的原始内容,不应该再次使用。

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

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

答案 1 :(得分:0)

事实证明,我在服务器应用程序中生成一段代码时出错,收到消息后我做了即时乒乓式回复,如:

zmq::message_t msg(msgSize);
REC.recv(&msg);
//pong
REC.send(msg);

正如上面的回答所指出的那样,发送一条消息会释放它的原始内容,给我带来不必要的随机字节乱码。