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

C++11 如何在boost::asio中仅读取udp套接字的一部分?,c++11,boost,tcp,udp,boost-asio,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::s

在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套接字是否支持部分读取?

准确地说,
read
的第三个参数不是长度参数,而是完成条件。如果此条件为真,则中止读/写操作
udp::socket::receive
不接受此参数,因为它在与
streambuf
一起使用时有意义
udp::socket::receive
有3个重载,其中没有一个采用
streambuf
。所有数据都采用存储传入数据的
MutableBufferSequence
。当您创建一个缓冲区来存储数据时,您需要提供这个缓冲区的大小此大小决定将读取多少字节。因此,在您的情况下,您需要准备具有1字节容量的缓冲区。有很多方法可以做到这一点

boost::asio::ip::udp::socketsock{io,ep};
boost::asio::ip::udp::endpoint from;
//吊舱阵列
char buf[1];//1字节数组
sock.receive_from(boost::asio::buffer(buf),from);
//指向POD的指针
字符buf2;//sizeof(char)==1
sock.receive_from(boost::asio::buffer(&buf2,1),from);
//载体
标准::向量buf3(1);//1字节长度
sock.receive_from(boost::asio::buffer(buf3),from);

插座的一部分?你是说数据报的一部分吗?NB UDP不是流协议。
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);