【问题标题】:What's the best way to store a set of IPv6 addresses?存储一组 IPv6 地址的最佳方式是什么?
【发布时间】:2015-01-07 11:48:54
【问题描述】:

我正在对一个遗留应用程序进行现代化改造,该应用程序将 IPv4 地址存储在一个固定大小的无符号长数组中。地址按主机字节顺序存储。也就是说,来自套接字 API 时为ntohl()'d,而去套接字 API 时为htonl()'d。

现在为了也支持 IPv6,我想知道如何处理这个数组。 我是否应该存储字符串表示形式,并将其设为char[INET6_ADDRSTRLEN] 甚至是std::vector<std::string>std::set<std::string> 的数组以支持更多地址。

或者,我可以存储in6_addr 结构,这可能比std::string 更有效,但是我想知道网络和主机字节顺序如何应用在这里?

【问题讨论】:

  • in6_addr 绝对是比std::string 更好的选择。 “网络和主机字节顺序在这里如何应用?”,你不能再使用简单的long 值来存储 IPv6 地址。
  • 所以只需使用 struct in6_addr 并且不要尝试将其转换为 128 位整数。看起来很公平。
  • @Philipp 是的。您应该提供一个用于封装 API 函数的类,正如我在上述链接问题的回答中所建议的那样。
  • 你对存储的地址做了什么?

标签: c++ data-structures ipv6 endianness


【解决方案1】:

in6_addr 确实要求地址按网络字节顺序排列。 in6_addr 在内部将 ipv6 地址存储为 16 个字符、8 个短裤、4 个整数的并集。

【讨论】:

    猜你喜欢
    • 2012-07-26
    • 1970-01-01
    • 2011-05-29
    • 2010-09-30
    • 2010-09-14
    • 2013-06-14
    • 2017-05-21
    • 1970-01-01
    • 2013-01-03
    相关资源
    最近更新 更多