Sto lavorando a un progetto di rete C/C++ che dovrebbe essere in grado di utilizzare entrambi gli stack di rete IPv4 e IPv6. Il progetto funziona solo su Linux. Quindi, ho cercato di trovare un modo efficiente per archiviare gli indirizzi IP e differenziare le famiglie di protocolli. Il primo approccio è stato quello di avere un'unione:Modo efficiente per archiviare gli indirizzi IPv4/IPv6
struct ip_addr {
uint8_t fam; // socket family type
union {
struct in_addr ipv4_sin_addr;
struct in6_addr ipv6_sin_addr;
}addr;
};
Il secondo approccio è stato quello di definire un typedef std::vector<unsigned char> IPAddressNumber
e fare la differenza dopo il numero di byte dal vettore.
Il terzo approccio è stato quello di utilizzare int128_t/uint128_t o __int128_t da gcc.
Per quest'ultimo caso, vorrei sapere da quale versione di GCC questi tipi sono supportati, per i quali le piattaforme (soprattutto IA-32/IA-64) e anche se ci sono bug conosciuti. Inoltre, quale delle soluzioni di cui sopra potrebbe essere la più conveniente?
Non sono sicuro che 'int128_t' sia necessario o adatto per indirizzi IPv6. Posix offre altri tipi nella sua API. Per GCC, utilizzare l'ultima versione (GCC 4.9.1 nell'ottobre 2014) e utilizzare C++ 11 se possibile. –
Vorrei anche raccomandare di usare la struttura ['struct sockaddr_in6'] (http://man7.org/linux/man-pages/man7/ipv6.7.html) per gestire gli indirizzi IPv6. –
Utilizzerai raramente gli indirizzi IP come numeri reali (inoltre dovranno essere forniti nell'ordine dei byte di rete). Quindi ancora: usare un 'uint128_t' per la rappresentazione di un indirizzo IPv6 è probabilmente una ** pessima idea **! –