LINUX.ORG.RU

Передать размер и данные одним пакетом.

 , ,


0

2

Есть std::vector который нужно передать на сторону клиента. Соответственно в начале отсылки нужно передать его размер. Так как сейчас использую асинхронный метод передачи, то встал вопрос как все передать одним вызовом. Сериализация будет слишком жирной. Мысли?

★★

Мысли?

у тебя их нет, видимо

отдать 4 первйх байта под размер это тяжело да, если это не последний сложный блин вопрос то пора заюзать messagepack или аналоги

Deleted
()
Ответ на: комментарий от Deleted

Отдать не тяжело, не хочется это делать двумя вызовами, так как они асинхронные. Это надо передать длину, потом дождаться колбэка и затем передавать массив.

Booster ★★
() автор топика
Ответ на: комментарий от Booster

без копирования

Тут либо пики, либо ну ты понел. Возьми что-нибудь для futures (promises), я точно знаю, что в крестах есть.

Deleted
()

Макс. длина чем ограничена? Есть возможность юзать в коде вместо вектора готовую к отсылке структуру? Типа

static const size_t cMaxWhateverSize = 4200;

struct Ready
{
  size_t currentSize;
  std::array<unsigned char,cMaxWhateverSize> whatever;
}
Pavval ★★★★★
()
Ответ на: комментарий от Deleted

На самом деле проблема на в копировании, а в том чтобы предать одним вызовом асинхронной функции два буфера или как-то их объединить в один и уже потом ждать коллбэк.

Booster ★★
() автор топика
Ответ на: комментарий от Booster

Корявенько. Длина может быть совсем разной.

Booster ★★
() автор топика
Ответ на: комментарий от Booster

не хочется это делать двумя вызовами, так как они асинхронные. Это надо передать длину, потом дождаться колбэка и затем передавать массив.

не понял, зачем ждать? на то он и асинхронный, чтобы не ждать, вроде
один хрен вектор поэлементно отсылать придется, так что лишняя передача длины погоды не сделает

anonymous
()

Хороший пример преждевременной оптимизации. Вчера у тебя busywait был, а сегодня ты уже думаешь о лишнем копировании. Причём даже решение, в котором ты не делаешь несколько вызовов, не даёт гарантии использования sendv тем же boost'ом.

Хочешь выжимать скорость, спускайся уровнем ниже, к использованию системных вызовов.

i-rinat ★★★★★
()

#include <sys/uio.h>

struct iovec data[2];
size_t len = 42;

data[0].iov_base = &len;
data[0].iov_len = sizeof(len);

data[1].iov_base = payload;
data[1].iov_len = len;

ssize_t rc = writev(fd, data, ARRAY_SIZE(data));
joy4eg ★★★★★
()
Последнее исправление: joy4eg (всего исправлений: 1)
Ответ на: комментарий от i-rinat

Нет это не преждевременная оптимизация. Копирование не причем. Проблема передать все данные одним вызовом и спокойно ждать в колбеке результата, а не делать это в два приема.

Booster ★★
() автор топика
Ответ на: комментарий от anonymous

Я тоже тебе желаю наилучшего, великий anonymous.

Booster ★★
() автор топика
Последнее исправление: Booster (всего исправлений: 1)
Ответ на: комментарий от Booster

А в чём именно проблема? Проблема может быть в том, что ты удаляешь вектор с данными до того, как у тебя вызывается хэндлер, например.

Deleted
()
Ответ на: комментарий от Deleted

С буфером все в порядке, он передается. Но заголовок пока скрестить красиво не получается.

Booster ★★
() автор топика
Ответ на: комментарий от cyanide_regime

В итоге получилось. Спасибо еще раз.

Booster ★★
() автор топика
Ответ на: комментарий от Booster

Хотел сказать, что для общения клиента и сервера нвадо придумать протокол.

unt1tled ★★★★
()
Ответ на: комментарий от unt1tled

Я уволился вообще в прошлом году и еще всякие анонимы мешают на хлеб заработать. Протокол всегда есть даже если кому-то кажется, что его нет. :)

Booster ★★
() автор топика
Последнее исправление: Booster (всего исправлений: 1)
Ответ на: комментарий от Booster

Чем больше твоих постов вижу, тем больше создается впечатление, что ты дебил с завышенным самомнением.

anonymous
()
Ответ на: комментарий от Booster

ты действительно пытаешься заняться не своим делом :)

и то что последний потенциальный работодатель озалупил тебя (в том числе, что важно) на асинхронном вводе-выводе, ещё совсем не значит что тебе не хватает только этот вопрос подтянуть

anonymous
()

Чем не вариант сделать свой вектор, назвав его например buffer, в котором сделать резервирование перед данными, куда и записывать длину?!

anonymous
()
Ответ на: комментарий от unt1tled

«Сделать» != велосипедить. Есть еще наследование и агрегирование, а еще переопределение. Странно требовать от общей реализации вектора, как массива, специфичного функционала, а т.к. расширенная версия - буфер, практически с ним идентична вариант с написанием выглядит вполне нормально.

anonymous
()

Интересно темы здесь модерируются/закрываются? Уже столько говна вылито и не по теме написано. Проблема давно решена и проект написан, а анонимы все ходят и срут. Мне то все равно, но зачем? Любят некоторые поднимать свою самооценку обсирая ближних на лево и на право.

Booster ★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.