gpt4 book ai didi

c++ - 存储 IPv4/IPv6 地址的有效方法

转载 作者:可可西里 更新时间:2023-11-01 18:25:25 27 4
gpt4 key购买 nike

我正在从事一个 C/C++ 网络项目,它应该能够同时使用 IPv4 和 IPv6 网络堆栈。该项目仅适用于 Linux。因此,我试图找到一种有效的方法来存储 IP 地址并区分协议(protocol)系列。第一种方法是建立 union :

struct ip_addr {
uint8_t fam; // socket family type
union {
struct in_addr ipv4_sin_addr;
struct in6_addr ipv6_sin_addr;
} addr;
};
第二种方法是定义一个 typedef std::vector IPAddressNumber 并在 vector 的字节数之后进行区分。

第三种方法是使用 gcc 中的 int128_t/uint128_t 或 __int128_t。

对于最后一个案例,我想知道哪些版本的 GCC 支持这些类型,哪些平台(尤其是 IA-32/IA-64)以及是否存在任何已知错误。另外,以上哪种解决方案可能是最方便的?

最佳答案

1st answer 中所述自 GCC 4.6.4 起提供 128 位整数支持。

您的问题不是 128 位整数支持,而是如何正确表示 IPv6 地址
正确答案是使用 struct定义可从 socket API 获得.

这些对于 IPv6 堆栈的各种操作系统实现是可用的和标准化的。
此外,您无需担心使用它们的效率。对齐打包将正常工作,您不必关心实际表示的字节顺序与网络字节顺序问题。


至于您的编辑:

您不必重新发明轮子!已经有合适的struct关于 AF_xxx 的可用定义家庭类型正确。

查看这些资源以获得更详细的解释:

我们有一个 IpAddr生产类,使用不透明 sockaddr_in*sockaddr_in6*基于 sockaddr* 封装 IPv4 或 IPv6 地址的指针指针,和 reinterpret_cast<>基于 sa_family结构成员。

关于c++ - 存储 IPv4/IPv6 地址的有效方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26531531/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com