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

徐飞

在 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 套接字完全支持部分读取吗?

rafix07

准确的说,of的第三个参数read不是长度参数,而是完成条件。如果此条件为真,则中止读/写操作。udp::socket::receive不带这个参数,因为它在使用 with 时有意义streambufudp::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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章