Я обрабатываю пользовательский пакет данных TCP с Boost.Поскольку все операции выполняются асинхронно, для обработки данных должен быть вызван обработчик.Основная проблема в том, что я не знаю, как передать данные обработчику, когда размер не известен во время компиляции?Например, скажем, вы получаете байты заголовка, анализируете их, которые сообщают вам длину тела:
int length = header.body_size();
Мне как-то нужно выделить массив с размером тела и затем вызвать обработчик (которыйявляется членом класса, а не статической функцией) и передает ему данные.Как мне сделать это правильно?
Я пробовал разные вещи, такие как, но всегда заканчивал тем, что получал segfault, или мне приходилось предоставлять фиксированный размер буфера тела, что не то, что я хочу.Попытка, которую я сделал, может быть найдена ниже.
После получения информации заголовка:
char data[header.body_size()];
boost::asio::async_read(_socket, boost::asio::buffer(data, header.body_size()),
boost::bind(&TCPClient::handle_read_body, this, boost::asio::placeholders::error,
boost::asio::placeholders::bytes_transferred, data));
Обработчик:
void TCPClient::handle_read_body(const boost::system::error_code &error, std::size_t bytes_transferred,
const char *buffer) {
Logger::log_info("Reading body. Body size: " + std::to_string(bytes_transferred));
}
В этом примере выдается ошибка сегмента.
Как я могу выделить буфер для тела после определения размера?И как тогда я могу вызвать обработчик и передать error_code
, bytes_transferred
и данные тела?
Пример фрагмента будет очень полезен, так как примеры надстроечного чата, которые делают это, не оченьмне ясно.