我正在开发一个 C/C++ 网络项目,它应该能够同时使用 IPv4 和 IPv6 网络堆栈。该项目仅适用于 Linux。因此,我试图找到一种有效的方法来存储 IP 地址并区分协议系列。第一种方法是建立一个工会:
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`并在向量的字节数之后产生差异。
第三种方法是使用 gcc 中的 int128_t/uint128_t 或 __int128_t。
对于最后一种情况,我想知道这些类型是从哪个 GCC 版本支持的,针对哪些平台(尤其是 IA-32/IA-64)以及是否有任何已知的错误。另外,上述哪种解决方案可能是最方便的?