У меня проблема с отправкой zmq-сообщения, построенного из указателя на struct, который содержит другую структуру.Отправка структуры, содержащей другую структуру, как сообщение ZeroMQ
Серверный код:
#include <zmq.hpp>
#include <string>
#include <iostream>
using namespace zmq;
using namespace std;
struct structB{
int a;
string c;
};
struct structC{
int z;
struct structB b;
};
int main()
{
context_t context(1);
socket_t *socket = new socket_t(context,ZMQ_REP);
socket->bind("tcp://*:5555");
message_t *request = new message_t();
socket->recv(request);
struct structB messageB;
messageB.a=0;
messageB.c="aa";
struct structC *messageC = new struct structC;
messageC->z = 4;
messageC->b = messageB;
char *buffer = (char*)(messageC);
message_t *reply = new message_t((void*)buffer,
+sizeof(struct structB)
+sizeof(struct structC)
,0);
socket->send(*reply);
return 0;
}
код клиента:
#include <zmq.hpp>
#include <iostream>
#include <string>
using namespace std;
using namespace zmq;
struct structB{
int a;
string c;
};
struct structC{
int z;
struct structB b;
};
int main()
{
context_t context(1);
socket_t *socket = new socket_t(context,ZMQ_REQ);
socket->connect("tcp://*:5555");
const char* buffer = "abc";
message_t *request = new message_t((void*)buffer,sizeof(char*),0);
socket->send(*request);
message_t *reply = new message_t;
socket->recv(reply);
struct structC *messageC = new struct structC;
messageC = static_cast<struct structC*>(reply->data());
cout<<messageC->b.a<<endl;//no crash here
struct structB messageB = messageC->b;//Segmentation fault (core dumped)
return 0;
}
Эта программа падает, когда я пытаюсь использовать строку под названием "с" от structB. Не имеет значения, пытаюсь ли я его распечатать или назначить целую структуру structB, как в приведенном выше примере.
Где проблема? Должен ли я создавать ответ на message_t * на стороне сервера по-разному?
У вас есть странное сочетание синтаксиса C и C++ (в C, struct - это отдельное пространство имен и при использовании используется ключевое слово 'struct', но в C++ они этого не делают. Почему вы _sometimes_ его используете?) И аналогично странный микс объектов-стеков и кучи (почему вы создаете 'messageB' в стеке и' messageC' на куче? 'messageC' также может быть создано в стеке. И' messageB' является частью 'messageC'; вам не нужно отдельный экземпляр.) –