Как преобразовать адреса IP4 и IP6 в длинные значения в C? - PullRequest
0 голосов
/ 18 февраля 2012

Мне нужна функция, которая работает с адресами IP4 и IP6, и мне нужно преобразовать адрес из его строкового представления (IP4) или шестнадцатеричного представления (IP6) в его длинное значение.Текущий код, который у меня есть:

struct addrinfo *addr;
// This converts an char* ip_address to an addrinfo, so now I know whether 
// it's a IP4 or IP6 address
int result = getaddrinfo(ip_address, NULL, NULL, &addr);
if (result ==0) {
    struct in_addr dst;
    result = inet_pton(addr->ai_family, ip_address, &dst);
    long ip_value = dst->s_addr;
    freeaddrinfo(addr);
    return ip_value;
}

Я получаю long от dst-> s_addr, но я почти уверен, что это неверно.Любые указатели на то, как решить эту проблему, очень ценятся!

1 Ответ

1 голос
/ 18 февраля 2012

Прежде всего, ваш dst недостаточно велик для адреса IPv6:

unsigned char buf[sizeof(struct in6_addr)]; /* Since it's larger than in_addr */
int result = getaddrinfo(ip_address, NULL, NULL, buf);

Если адрес IPv4, buf - это in_addr, то есть uint32_t.

uint32_t u;
memcpy(&u, buf, sizeof(u));

Если адрес IPv6, преобразование в long на самом деле не имеет смысла.Вам нужно что-то шириной 128 бит или выкатываете свое.Этот последний бит не так прост, поэтому спросите себя: вы уверены, что нужно это?

...