2014-10-01 149 views
0

我很难理解如何正确使用0MZ。当我试图发送大于29的初始化消息时,出现了问题。我的代码是非常简单的:ZeroMQ - 使用REQ套接字发送超过30个字节

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! 

我unders tand,短消息有29个字节的限制,但是我怎样才能解决它,而不处理多部分消息?我真的需要像40个字符....

+1

根据[zmq_send()](http://api.zeromq.org/2-1:zmq-send)的0MQ文档,成功调用该函数('zmq :: socket_t :: send')它)破坏消息。所以在消息排队后,你不应该访问数据成员**。它适用于较小的消息可能是一个实现人工制品。 – 2014-10-01 07:11:59

+0

但是为什么我的信息也在服务器上搞砸了? – 2014-10-01 07:16:59

+0

请注意,在显示的最后3行代码中,接收到的消息被称为“reply”,但您仍然会打印“test”的数据内容。 – 2014-10-01 10:55:10

回答

1

如果消息是> 30个字节,内存曾经被'测试'占用,但随后被释放,必须被回复数据(显然是偶然)重用。因此,当你再次看“测试”时,它神奇地似乎是你认为应该是的。这个理论应该非常简单,通过查看地址来验证调试器。

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

ZeroMQ针对小型消息进行了优化,其中有效载荷不需要单独分配。同样,在发送消息之后,您仍然可以看到您期望的内容的事实只是一种人造物;你不能依靠它。

如果您有要求在发送邮件后保留邮件的内容,请查看zmq_send_const(),这是ZMQ 4.0的新增功能。我不知道是否有任何绑定使用它。即时乒乓式的答复,像

+0

我不确定,但是这并不解释为什么在服务器端的消息也错了? – 2014-10-01 09:21:57

+0

@ClockworkOrkwork很难说,你还没有发布你的服务器代码。 – 2014-10-01 11:12:17

+0

你是对的,现在我可以说有一个zmq :: poll等待消息,我会稍后添加代码 – 2014-10-01 11:18:08

0

事实证明,我有一个错误产生一张我的服务器应用程序中的代码,接收消息我做后:

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

正如上面的回答指出,发送一条消息可以释放它的原始内容,使我不必要的乱码随机字节。

相关问题