首页 > 解决方案 > 如何在不制作额外副本的情况下从 sockaddr_in6 创建 boost::asio::ip::address_v6?

问题描述

问题是address_v6类严格接受原始数据作为bytes_type类:

typedef array< unsigned char, 16 > bytes_type;

但是sockaddr_in6struct 没有,它有 C 风格的数组,如果std::array不复制就无法转换。所以我必须创建一个std::array,在那里复制数据,并将该数组传递给address_v6,它将数据从该数组复制std::array到其内部缓冲区。

我希望我可以使用或实现一些 C 风格的数组查看器类,但无论如何我都无法将它传递给构造函数,因为它不是模板函数。

有什么方法可以在address_v6不制作额外数据副本的情况下创建一个?

标签: c++boostboost-asio

解决方案


必须是包含原始数组作为其第std::array一个也是唯一一个非静态数据成员的结构。由于原始数组包含unsigned chars,因此它是标准布局类。因此,我无法从标准中找到以下代码不起作用的原因:

auto& bytearray = reinterpret_cast<std::array<unsigned char,16>&>(ipv6socket->sin6_addr.s6_addr); 

如果要复制,请替换auto&为纯文本。auto


推荐阅读