2013-04-09 7 views
2

Я не могу отправить vectorstruct, который я сериализовал с помощью msgpack через ZeroMQ.Отправка вектора через zeromq с помощью msgpack

Это вектор этой структуры:

struct MyData 
{ 
    MyData() : id(0), x(0), y(0), a(0) {} 
    MyData(const Obj &r) : id(0), x(r.pose[0]), y(r.pose[1]), a(r.pose[2]) {} 
    MyData(const Obj *r) : id(0), x(r->pose[0]), y(r->pose[1]), a(r->pose[2]) {} 
    double id; 
    double x; 
    double y; 
    double a; 
    MSGPACK_DEFINE(id, x, y, a); 
}; 

На передающей стороне:

data является std::vector<MyData>

msgpack::sbuffer sbuf; 
msgpack::pack(sbuf, data); 
zmq::message_t msg(sbuf.data(), sizeof(char *) * sbuf.size(), NULL, NULL); 
local_socket->send(msg); // this is just zeromq's send function 

ли я построить мой sbuffer или message_t неправильно ?

На приемной стороне:

Я не уверен, если я должен был бросить msg.data() или нет, но я не могу найти хорошую документацию о том, как работать с ZeroMQ и messagepack.

message_t msg; 
server_socket->recv(&msg); 

msgpack::unpacked unpacked; 
msgpack::unpack(&unpacked, reinterpret_cast<char*>(msg.data()), msg.size()); 
msgpack::object obj = unpacked.get(); 

std::vector<MyData> data; 
obj.convert(&data); 
printf("size %d\n", data.size()); 

Я получаю следующее сообщение об ошибке:

terminate called after throwing an instance of 'msgpack::type_error'
what(): std::bad_cast Aborted

Я был бы признателен за любую помощь.

ответ

5

Это, кажется, сделал трюк для меня:

msgpack::sbuffer sbuf; 
msgpack::pack(sbuf, data); 
zmq::message_t msg(sbuf.size()); 
memcpy(msg.data(), sbuf.data(), sbuf.size()); 
Смежные вопросы