【发布时间】:2014-12-19 07:46:56
【问题描述】:
我正在开发一个 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)以及是否存在任何已知错误。另外,以上哪种解决方案可能是最方便的?
【问题讨论】:
-
我不确定
int128_t是否需要或是否适合 IPv6 地址。 Posix 在其 API 中提供了其他类型。对于 GCC,最好使用最新版本(2014 年 10 月的 GCC 4.9.1)并尽可能使用 C++11。 -
我还建议使用
struct sockaddr_in6结构来处理 IPv6 地址。 -
您很少将 IP 地址用作实数(除了它们需要按网络字节顺序提供)。再说一遍:使用
uint128_t表示 IPv6 地址可能是一个非常糟糕的主意! -
struct sockaddr_storage可用于与家庭无关的存储,它很方便,从定义上来说并不节俭。