Динамический размер boost :: asio :: buffer - PullRequest
7 голосов
/ 09 мая 2011

Я читаю с boost::asio::ip::udp::socket вот так:

using boost::asio::ip::udp;

// ...

char recv_buf[128];
udp::endpoint sender_endpoint;
size_t len = socket.receive_from(boost::asio::buffer(recv_buf), sender_endpoint);

Теперь, это прекрасно работает, но максимальное количество символов, которое я могу получить, теперь составляет 127. Однако я столкнулся с проблемой, потому что мне нужно принять некоторые данные, длина которых может сильно варьироваться (и например, недостаточно определенной длины с префиксными заголовками). Решением этой проблемы был бы динамически расширяющийся буфер, такой как вектор. Можно ли создать динамически расширяющийся boost::asio::buffer, чтобы принимать (теоретические) бесконечные объемы ввода и хранить его в контейнере?

Ответы [ 4 ]

5 голосов
/ 09 мая 2011

Размер UDP-дейтаграммы не сильно меняется: он никогда не будет больше 65535 , оставляя место для 65 527 байт данных после 8-байтового заголовка.

1 голос
/ 17 мая 2011

Если вы используете меньшие буферы, вы можете легко объединить их в цепочку с помощью концепций * BufferSequence.Например, вы можете передать MutableBufferSequence для принятия данных из вызова read (2) или передать ConstBufferSequence для списка буферов, которые вы собираетесь записать (2),Тем не менее, я склонен рекомендовать использовать один буфер в каждом направлении, потому что это имеет тенденцию упрощать код (хотя это не всегда возможно).

0 голосов
/ 13 марта 2018

Добавлена ​​поддержка 1.66.0 dynamic_buffer, которая может адаптировать ссылку к std::string или std::vector<CharType>:

0 голосов
/ 09 мая 2011

Кажется, что нет никаких условий для динамического определения размера.И имеет смысл, что не будет.Подумайте о том, что должно произойти:

  • Одна дейтаграмма UDP может быть получена только один раз и сразу, поэтому:
  • буфер, предоставленный системному вызову низкого уровня, необходимчтобы быть достаточно большим для самого большого действительного сообщения, поэтому
  • для того, чтобы оно было эффективным, буфер должен быть заранее выделен вызывающей стороной.

Так что он не делаетсмысл в наличии динамического размера буфера.Как указывает Кубби, UDP-дейтаграммы в любом случае имеют минимальный максимальный размер, поэтому просто увеличьте размер буфера до самого большого допустимого сообщения в вашей системе и покончите с этим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...