在 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 套接字完全支持部分读取吗?
准确的说,of的第三个参数read
不是长度参数,而是完成条件。如果此条件为真,则中止读/写操作。udp::socket::receive
不带这个参数,因为它在使用 with 时有意义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);
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句