【问题标题】:How to read only part of a udp socket in boost::asio?如何在 boost::asio 中仅读取 udp 套接字的一部分?
【发布时间】:2019-02-13 03:19:34
【问题描述】:

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

【问题讨论】:

  • 套接字的一部分?你的意思是数据报的一部分吗?注意 UDP 不是流协议。

标签: c++11 boost tcp udp boost-asio


【解决方案1】:

准确地说,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);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多