Как создать boost :: asio :: buffer с помощью uint8_t * [Возможно ли это?] - PullRequest
0 голосов
/ 24 июня 2019

Этот вопрос о boost :: asio :: buffer

У меня есть звонок для отправки данных через сокет TCP. Следующий звонок:

std::vector<unsigned char> data = GetDataToSend();
boost::asio::async_write(tcp_socket, boost::asio::buffer(data), 
    [this](const boost::system::error_code & error, std::size_t bytes_sent) {
        if (!error && bytes_sent > 0) {
            // Success!
        }
    });

Выше это здорово, пока GetDataToSend возвращает std::vector<unsigned char>.

Но , что если GetDataToSend вернул uint8_t*? Разве нельзя поместить данные uint8_t* в boost::asio::buffer и выполнить async_write? Нечто вроде ниже ..

uint8_t* data = GetDataToSend();
boost::asio::async_write(tcp_socket, boost::asio::buffer(data), 
    [this](const boost::system::error_code & error, std::size_t bytes_sent) {
        if (!error && bytes_sent > 0) {
            // Success!
        }
    });

Это то, что boost::asio::buffer работает только на std::vector<unsigned char> с? Как я могу создать boost::asio::buffer объект из uint8_t*? Было бы здорово, если бы я мог сделать это без дополнительной копии, если это возможно.

Я использую Boost 1.63.

1 Ответ

1 голос
/ 24 июня 2019

На странице есть все перегрузки буфера, одна из которых

const_buffer buffer(
    const void * data,
    std::size_t size_in_bytes);

, вы можете использовать ее, но вам нужно определить размер буфера.Без этого, как async_write может знать, сколько байтов должно быть передано?В случае vector, buffer знает этот размер, вызывая метод vector::size.В случае необработанных буферов вы должны предоставить это явно.

Если GetDataToSend вернул пару: указатель на данные и их длину, вы можете написать:

std::pair<uint8_t*,size_t> GetDataToSend() {
   // ... 
   return result;  
}

std::pair<uint8_t*,int> data = GetDataToSend();
boost::asio::async_write(tcp_socket, boost::asio::buffer(data.first, data.second), ...
...