저는 C/C++ 네트워킹 프로젝트에서 IPv4 및 IPv6 네트워킹 스택을 모두 사용할 수 있어야합니다. 프로젝트는 Linux에서만 작동합니다. 그래서 IP 주소를 저장하고 프로토콜 제품군을 구분하는 효율적인 방법을 찾으려고했습니다. 첫 번째 방법은 연합 갖도록 하였다 :효율적인 방법으로 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;
};
번째 방법은 typedef std::vector<unsigned char> IPAddressNumber
을 정의하고, 벡터의 바이트 수 후의 차이를 확인 하였다.
제 3 수법은 GCC에서
/또는 uint128_t __int128_t int128_t을 사용하는 것이었다.이 지난 경우, 나는, 이러한 유형이 지원되는 GCC의 버전을 알고 싶습니다하는 플랫폼 (특히 IA-32/IA-64)도 알려진 버그가있는 경우. 또한 위의 솔루션 중 가장 편리한 솔루션은 무엇입니까?
IPv6 주소에 'int128_t'가 필요하거나 적합하지 않은 것인지 잘 모르겠습니다. Posix는 API에 다른 유형을 제공합니다. GCC의 경우 최신 버전 (2014 년 10 월 GCC 4.9.1)을 사용하고 가능한 경우 C++ 11을 사용하십시오. –
IPv6 주소를 처리하기 위해 [struct sockaddr_in6'] (http://man7.org/linux/man-pages/man7/ipv6.7.html) 구조를 사용하는 것이 좋습니다. –
IP 주소를 실제 숫자로 사용하는 경우가 거의 없습니다 (네트워크 바이트 순서로 제공해야 함). 다시 한번 : IPv6 주소를 표현하기 위해'uint128_t'를 사용하는 것은 아마 ** 매우 나쁜 생각입니다 **! –