繁体   English   中英

C ++ Boost asio获取数据大小?

[英]C++ Boost asio get data size?

我正在使用boost asio库来使用tcp读取一些数据。 使用a.accept(*sock); ,如何获取客户端将发送的第一个数据包的大小?

我使用(sock->remote_endpoint().address()).to_string()来获取用户的IP地址,所以我猜必须有一个类似的简单方法来获取数据包的大小,对吗?

在应用程序级别,了解当前可用于读取的字节数而不是数据包大小通常要有用得多。 可用于读取的数据量可以由一个或多个TCP 段构成 OSI模型中 ,TCP (第4层:传输)可以由一个或多个IP层数据包 (第3层:网络)构成,每个数据包可以由一个或多个以太网 (第2层:数据链路)构成。

因此,我将假定应用程序对知道要读取多少字节感兴趣,而不是对较低级别的细节(例如数据包的大小)感兴趣。 有一些解决此问题的方法:

  • 通过socket::available()查询套接字有多少可用数据,然后相应地分配缓冲区。

     std::vector<char> data(socket_.available()); boost::asio::read(socket_, boost::asio::buffer(data)); 
  • 使用Boost.Asio可以在内存中增长的类,例如boost::asio::streambuf 一些操作,例如boost::asio::read()接受streambuf对象作为它们的缓冲区,并将根据该操作的需要分配内存。 但是,应提供完成条件。 否则,操作将继续,直到缓冲区已满。

     boost::asio::streambuf data; boost::asio::read(socket_, data, boost::asio::transfer_at_least(socket_.available())); 
  • 正如Igor R.在评论中所建议的,将长度作为通信协议的一部分。 查看Boost.Asio 示例以获取通信协议示例。 关注协议,不必关注Boost.Asio API

    • 在固定长度协议中,恒定字节大小用于指示消息边界,例如在Boost.Asio Porthopper示例中。 由于读者知道消息的大小,因此读者可以提前分配缓冲区。
    • 在可变长度协议中,例如在Boost.Asio Chat示例中使用的协议,消息通常分为两部分:标头和正文。 一种方法是具有一个固定大小的标头,其中包含各种元信息,例如主体的长度。 这允许应用程序将标头读取到固定大小的缓冲区中,提取主体长度,为主体分配一个缓冲区,然后读取主体。

       // Read fixed header. std::vector<char> data(fixed_header_size); boost::asio::read(socket_, boost::asio::buffer(data)); protocol::header header(data); network_to_local(header); // Handle endianess. // Read body. data.resize(header.body_length()); boost::asio::read(socket_, boost::asio::buffer(data)); protocol::body body(data); network_to_local(body); // Handle endianess. 

另一方面,如果我弄错了,而您确实需要一个数据包的总长度 ,那么可以使用basic_raw_socket Boost.Asio的ICMP示例演示了如何从套接字读取IPv4数据包,并提取标头的字段值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM