如何只读取 boost::asio 中的 udp 套接字的一部分?
How to read only part of a udp socket in 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 socket的一部分,比如只读socket流的1个字节?
我检查了 receive()
函数,但它不接受长度参数。 udp socket是否完全支持部分读取?
准确的说,read
的第三个参数不是长度参数,是完成条件。如果此条件为真,read/write 操作将中止。 udp::socket::receive
不采用此参数,因为它在与 streambuf
一起使用时有意义。 udp::socket::receive
有 3 个重载,其中 none 个采用 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);
在 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 socket的一部分,比如只读socket流的1个字节?
我检查了 receive()
函数,但它不接受长度参数。 udp socket是否完全支持部分读取?
准确的说,read
的第三个参数不是长度参数,是完成条件。如果此条件为真,read/write 操作将中止。 udp::socket::receive
不采用此参数,因为它在与 streambuf
一起使用时有意义。 udp::socket::receive
有 3 个重载,其中 none 个采用 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);