8

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)、および既知のバグがあるかどうかを知りたいです。また、上記の解決策のうち、最も便利なものはどれですか?

4

3 に答える 3

10

最初の回答で述べたように、128 ビット整数のサポートは GCC 4.6.4 以降で利用可能です。

問題は 128 ビット整数のサポートではなく、IPv6 アドレスを正しく表現する方法です。
これに対する正しい答えは、ソケット APIstructから利用可能な定義を使用することです。

これらは、IPv6 スタックのさまざまなオペレーティング システムの実装で利用可能であり、標準化されています。また、これらを使用して効率
を 心配する必要はありません。アライメント パッキングは適切に機能し、エンディアンと実際の表現のネットワーク バイト オーダーの問題を気にする必要はありません。


あなたの編集に関して:

車輪を再発明する必要はありません。ファミリ タイプを正しく考慮structした、適切な定義が既に用意されています。AF_xxx

詳細な説明については、次のリソースを確認してください。

IpAddropaquesockaddr_in*とポインターを使用して、ポインターと構造体のメンバーに基づいsockaddr_in6*て IPv4 または IPv6 アドレスのいずれかをカプセル化する、実稼働中のクラスがあります。sockaddr*reinterpret_cast<>sa_family

于 2014-10-23T17:17:12.347 に答える