Effiziente Möglichkeit zum Speichern von IPv4 / IPv6-Adressen

Ich arbeite an einem C / C ++ - Netzwerkprojekt, bei dem die IPv4- und IPv6-Netzwerkstacks verwendet werden sollen. Das Projekt funktioniert nur unter Linux. Daher habe ich versucht, eine effiziente Möglichkeit zum Speichern der IP-Adressen und zur Unterscheidung zwischen den Protokollfamilien zu finden. Der erste Ansatz war eine Gewerkschaft:

struct ip_addr {
   uint8_t fam; // socket family type
   union {
       struct in_addr ipv4_sin_addr;
       struct in6_addr ipv6_sin_addr;
   }addr;
};

Der zweite Ansatz bestand darin, ein @ zu definiertypedef std::vector<unsigned char> IPAddressNumberund machen den Unterschied nach der Anzahl der Bytes aus dem Vektor.

Der dritte Ansatz bestand darin, int128_t / uint128_t oder __int128_t von gcc zu verwenden.

Für diesen letzten Fall möchte ich wissen, ab welcher Version von GCC diese Typen unterstützt werden, für welche Plattformen (insbesondere IA-32 / IA-64) und ob bekannte Fehler vorliegen. Welche der oben genannten Lösungen ist möglicherweise die bequemste?

Antworten auf die Frage(2)

Ihre Antwort auf die Frage