Как использовать Socket Recv в сочетании с std :: vector без стоимости изменения размера в C ++ 23? [закрыто]C++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Как использовать Socket Recv в сочетании с std :: vector без стоимости изменения размера в C ++ 23? [закрыто]

Сообщение Anonymous »

Существует метод для чтения данных из сокета и хранения полученных данных в std :: vector .
Один такой пример можно найти здесь.
Для удобства вот копия кода. < /p>

Код: Выделить всё

const size_t recv_buffer_length = 128;

std::vector recv_buffer;
recv_buffer.resize(recv_buffer_length);

const auto byte_count = recv(peer_fd, recv_buffer.data(), recv_buffer_length, 0);
recv_buffer.resize(byte_count);

// does not print anything. `.size() > 0`, but each element is `\0`
for(const auto i: std::views::iota(0, byte_count))
{
std::print("{}", recv_buffer[i]);
}
< /code>
Решение неэффективно. Причина в том, что RESRIFE 
использует значение по умолчанию для инициализации элементов std :: ecector .
Когда я изначально увидел этот вопрос, я думал, что он выполняет Резервная операция , чтобы избежать этого дополнительных накладных расходов. Однако я ошибся. recv возвращает количество полученных байтов, поэтому вектор просто должен быть изменен d до этого размера после того, как Recv вызывается для его заполнения данных.
Проблема в том, что если размер увеличивается, данные станут повреждены. < /p>
есть решение для этого? Предпочтительно тот, который избегает необходимости возвращаться к необходимости отслеживать указатель и переменную длины. < /P>
объяснить более подробно: < /p>
  • Программа запускается в цикле, вызывая recv для заполнения вектора
  • При первом запуске программы, резерв вызывается, с последующим изменением размер . Обе функции принимают некоторое значение, которое является максимальным размером буфера, используемого RECV . RESRIFE вызывается со значением нуля, чтобы убедиться, что программа находится в разумном состоянии.
  • Программа входит в recv loop.
  • вызывается, возвращая 200 байтов данных. Это меньше, чем векторная емкость, и 200 байтов записаны в буфер. resize вызывается с аргументом 200. Весь из первых 200 байтов перезаписывается Zeros.
Решение кажется: < /p>

Не вызовите resize < /code> с аргументом нуля. < /li>
< /ul>
< P> Однако, поскольку программа работает в цикле, это будет работать только для первой итерации. После этого буфер был изменен до некоторого меньшего значения, и в какой -то момент будущий вызов должен будет вызовать Resectize с большим значением.

Подробнее здесь: https://stackoverflow.com/questions/794 ... t-of-resiz
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

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

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»