• Как правильно сформировать экономный пакет данных об игроках?

    Nipheris
    @Nipheris Куратор тега C++
    Ваша проблема решается даже не просто, а элементарно.
    Для этого нужно запомнить простейший способ передачи групп элементов переменной (т.е. заранее неизвестной) длины: сначала передавать длину, а потом уже сами элементы в нужном количестве.
    Этот подход используется повсеместно. Например, когда на диск сохраняют строки переменного размера, и в строке неудобно/невозможно применить символ-терминатор, то сначала записывают длину строки (неотрицательное число нужной разрядности - байт, 2-х байтовое целое, 4-х байтовое целое), а потом уже содержимое строки. Кстати, такие строки называются паскалевскими (в альтернативу нуль-терминированным Cи-строкам).
    Разумеется, приемник пакета должнен быть достаточно умным, чтобы сначала принять длину, выделить себе некую стркутуру нужного размера (вектор подходит отлично, т.к. можно попросить его сразу зарезервировать нужное количетсво элементов), а затем записать ожидамое количество элементов.

    Вариант кода передачи:
    std::vector<PacketMultiPlayer> serverMuPackets;
    ......
    const unsigned int packetsCount = serverMuPackets.size();
    send(sock,(char*)(&packetsCount), sizeof(packetsCount), 0);
    send(sock,(char*)serverMuPackets.data(), sizeof(PacketMultiPlayer) * packetsCount, 0); // Имеем право так делать, т.к. вектор гарантирует последовательное хранение элементов. Со списком подобное делать нельзя
    Ответ написан
    Комментировать
  • Как правильно сформировать экономный пакет данных об игроках?

    mannaro
    @mannaro
    Умею профессионально гуглить
    Ответ написан
    Комментировать