在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套接字是否完全支持部分读取?
答案 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);