如何仅在boost :: asio中读取udp套接字的一部分?

时间:2019-02-13 03:19:35

标签: c++11 boost tcp udp boost-asio

在boost :: asio :: tcp中,我可以使用boost::asio::read来仅读取tcp套接字的一部分。

boost::system::error_code error;
boost::asio::streambuf len_buffer;
size_t n = boost::asio::read(tcp_socket, len_buffer, boost::asio::transfer_exactly(1), error);

但是boost::asio::read函数不适用于udp::socket

然后如何仅读取udp套接字的一部分,例如,仅读取套接字流的1个字节?

我已经检查了receive()功能,但是它不接受长度参数。 udp套接字是否完全支持部分读取?

1 个答案:

答案 0 :(得分:0)

确切地说,read的第三个参数不是长度参数,它是完成条件。如果满足此条件,则读/写操作将中止。 udp::socket::receive不使用此参数,因为在与streambuf一起使用时有意义。 udp::socket::receive具有3个重载,并且没有一个承担streambuf。全部取MutableBufferSequence存放输入数据。创建缓冲区以存储数据时,需要提供此缓冲区的大小。 此大小确定要读取的字节数。因此,在您的情况下,您需要准备1字节容量的缓冲区。 buffer有很多方法可以实现。

boost::asio::ip::udp::socket sock{io,ep};
boost::asio::ip::udp::endpoint from;

// array of POD
char buf[1]; // 1 byte array
sock.receive_from(boost::asio::buffer(buf),from);

// pointer to POD
char buf2; // sizeof (char) == 1
sock.receive_from(boost::asio::buffer(&buf2,1),from);

// vector
std::vector<char> buf3(1); // 1 byte length
sock.receive_from(boost::asio::buffer(buf3),from);