2014-11-08 55 views
0

由于像这样收到zeromq消息:获取zeromq消息数据为标准::向量<char>

zmq_msg_t messageIn; 
int rc = zmq_msg_init(&messageIn); 
rc = zmq_msg_recv(&messageIn, socket, 0); 

我想访问传入的消息数据并将其存储到一个;

std::vector<char> inMsg; 

尝试此;

std::memcpy(&inMsg, zmq_msg_data(&messageIn), zmq_msg_size(&messageIn)); 

没有工作。任何人都可以提供关于如何实现这一目标的建议?

+0

'使用inMsg地址显然没有做你想要的东西,因为它并不指向一个存储memcpy'。拉维回答了你的问题。使用他得到的msg_str可以使用'msg_str.begin()'和'end()'来迭代字符。如果你不想使用'std :: string',你可以使用数组。像你一样,将char * inMsg = new char [zmq_msg_size(&messageIn);''memcpy'放入此数组中。 – 2014-11-08 20:38:32

回答

1

它不工作的原因是因为你似乎没有要调整你的vector你要复制到其中的数据的能力。它也不起作用,因为您将vector对象的地址传递给memcpy而不是vector正在存储的数据的地址。 vector对象通常只包含两个指向它管理的存储的开始和结束的指针。你想访问的是一个指向该存储器的指针,你可以使用&inMsg[0]或C++ 11 inMsg.data()

所以尝试:

std::vector<char> inMsg(zmq_msg_size(&messageIn)); 
std::memcpy(inMsg.data(), zmq_msg_data(&messageIn), zmq_msg_size(&messageIn)); 
+0

解决了这个问题。非常感谢。 – GoFaster 2014-11-10 14:21:02

2

你可以做下面的事情。

zmq::message_t request; 

socket.recv (&request); 

std::string msg_str(static_cast<char*>(request.data()), request.size()); 

然后将字符串存储在向量中。这将是处理要容易得多......

std::vector<std::string> strVec; 
strVec.push_back(msg_str); 
+0

是的,接收消息可以用std :: string完成,但这不是我所要求的。 – GoFaster 2014-11-08 19:48:42

+2

我回答了你的问题...... – ravi 2014-11-08 20:03:31