Ukio_G
@Ukio_G
Незамысловатый юноша.

В чем может быть проблема при передаче контейнера «сложных» объектов по UDP?

Есть, предположим, вот такой вот набор синтетических конструкций:
#include <cstdint>
#include <deque>
#include <algorithm>

struct Point;
struct Additional;

struct Track
{
    uint64_t id;
    std::deque<Point> points;

    void appendNewPoint(int x, int y, Additional additional);
};


struct Additional
{
    int dx;
    int dy;
};

struct Point
{
    Additional additional_data;
    int x;
    int y;
    uint64_t id;
    Track * parent;
    Point * next();
    Point * prev();
};

Point * Point::next()
{
    auto& container = parent->points;
    auto result = std::find_if(container.begin(), container.end() - 1, [this](Point& n) {
        return this == &n;
    });
    return (result == container.end() - 1 ) ? this : &(*(result + 1));
}

Point * Point::prev()
{
    auto& container = parent->points;
    auto result = std::find_if(container.rbegin(), container.rend() - 1, [this](Point& n) {
        return this == &n;
    });
    return (result == container.rend() - 1 ) ? this :  &(*(result + 1));
}

void Track::appendNewPoint(int x, int y, Additional additional)
{
    Point point = {additional, x, y, this->points.size(), this};
    this->points.push_back(point);
}


Допустим, у меня есть некоторый контейнер, который хранит данные типа Track:
std::unordered_map<uint64_t, Track> Tracks;

Вопрос:
Как мне передать это по UDP пользуясь unix сокетами?
Я так понимаю, это все ведь можно представить как набор данных, представить его как void * выделить под данные пол мегабайта, и отправить это все дело на сервер, а на сервере полученные данные скастовать обратно в std::unordered_map <uint64_t, Track> или нельзя так делать? Если нельзя, то как можно?

P.S.: Методы структур представлены в ознакомительных целях, чтобы показать, что структуры, которые я собираюсь передать также имеют некоторые методы, механика которых не сильно (но все-таки) отличается от приведенных здесь.
  • Вопрос задан
  • 97 просмотров
Решения вопроса 1
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Вопрос:
Как мне передать это по UDP пользуясь unix сокетами?

Сериализовать в непрерывную область памяти, убедиться, что она влезет в UDP-пакет (а у него есть ограничение длины, чуть меньше 64Кб), передать, принять, де-сериализовать в свою структуру.

это все ведь можно представить как набор данных, представить его как void * выделить под данные пол мегабайта, и отправить это все дело на сервер, а на сервере полученные данные скастовать обратно в std::unordered_map <uint64_t, Track> или нельзя так делать?

Нельзя так делать, если не знаешь наверняка внутренней структуры того, что посылаешь. Потому что это твой std::unordered_map -- наверняка не один сплошной кусок памяти и содержит указатели. И когда ты его передашь на другую машину, указатели будут указывать неизвестно куда.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы