Отправка векторов по сетевому соединению

У меня возникла проблема с отправкой векторов через соединение enet, потому что векторы кажутся представленными в своих собственных данных, возможно, указывающих на то, где на самом деле хранятся внутренние данные векторов, и я не могу понять, как получить к ним доступ.

И клиент, и сервер имеют следующую структуру данных:

typedef struct {
unsigned int type;
vector<int> content;
} packetFormat;

Данные отправляются на сервер следующим образом:

packetFormat var;
var.type = 5; //sizeof is 4 bytes
var.content = {1, 3, 5, 20, 10, 50, 10, 10}; //sizeof is 16 bytes regardless of data
//total 20 bytes, 21 counting \0 character
ENetPacket* packet = enet_packet_create((char*)&var, sizeof(var) + 1, ENET_PACKET_FLAG_RELIABLE);
enet_host_broadcast(client, 0, packet);

Затем сервер получает и преобразует данные в ту же структуру:

//receives 21 bytes, which is correct
packetFormat* var = (packetFormat*)(event.packet->data);

Однако, проверяя переменные, var-> type равен 5, что правильно, но когда я пытаюсь проверить size () или любое содержимое вектора, он либо вылетает на сервер, либо выдает данные мусора. Как я уже говорил ранее, я думаю, что это потому, что вектор в структуре на самом деле является указателем, но знает ли кто-нибудь, как передавать и повторно собирать необработанные данные? Благодарю.

2

Решение

Если вы понимаете, что делает ваш код, это просто сериализация struct как если бы он не имел косвенных указаний, как базовая ширина фиксированной ширины.

Вектор внутри имеет указатель на свои данные, поэтому сериализует vector в структуре вы отправляете только значение указателя, а не сами данные, на которые он указывает.

Также было бы очень мало абсолютно никакой гарантии, что sizeof и макет vector будет одинаковым на хосте и размере клиента.

Если вы хотите отправить vector Я хотел бы рассмотреть возможность использования сетевой библиотеки C ++, которая понимает векторы, например Boost.Asio.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]