如何用 uint8_t* 创建一个 boost::asio::buffer [这可能吗?]

How to create a boost::asio::buffer with uint8_t* [Is it possible?]

这个问题是关于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!
        }
    });

只要GetDataToSendreturns一个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>进行操作? 如何从 uint8_t* 创建一个 boost::asio::buffer 对象?如果我能做到这一点而不会造成额外的副本,那就太好了。

我正在使用 boost 1.63。

page上,所有缓冲区重载,其中之一是

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), ...