我正在开发一个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;
};
第三种方法是使用int128_t/uint128_t或来自gcc的__int128_t。
对于最后一种情况,我想知道从哪个版本的GCC开始支持这些类型,支持哪些平台(特别是IA-32/IA-64),还有是否存在已知的bug。另外,上述解决方案中哪一个可能是最方便的?
int128_t
是否适用于IPv6地址。Posix在其API中提供了其他类型。对于GCC,最好使用最新版本(2014年10月的GCC 4.9.1),如果可能的话使用C++11。 - Basile Starynkevitchstruct sockaddr_in6
结构体来处理 IPv6 地址。 - πάντα ῥεῖuint128_t
来表示IPv6地址可能是一个非常糟糕的想法! - πάντα ῥεῖstruct sockaddr_storage
可用于面向用户族群存储,它非常方便,但并非按位紧凑的定义。 - Steve-o