IPv4 と IPv6 の両方のネットワーク スタックを使用できるようにする C/C++ ネットワーク プロジェクトに取り組んでいます。プロジェクトは 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;
};
2 番目のアプローチは、「typedef std::vector IPAddressNumber」を定義し、ベクターからのバイト数の後に違いを作ることでした。
3 番目のアプローチは、gcc から int128_t/uint128_t または __int128_t を使用することでした。
この最後のケースについて、これらのタイプがサポートされている GCC のバージョン、プラットフォーム (特に IA-32/IA-64)、および既知のバグがあるかどうかを知りたいです。また、上記の解決策のうち、最も便利なものはどれですか?