Парсинг IPv6 в C

Я хотел знать, как я могу проанализировать адрес IPv6 в C и преобразовать его в 128 битовых значений?

Так шестнадцатеричный адрес как 1:22:333:aaaa:b:c:d:e потребности, которые будут преобразованы в его эквивалентный двоичный файл на 128 битов. Проблемой является IP-адрес, мог иметь тип ::2 и его вариант, так как они - допустимый адрес IPv6.

Вход с клавиатуры и следовательно находится в формате ASCII.

11
задан Yu Hao 2 August 2018 в 07:12
поделиться

3 ответа

Вы можете использовать POSIX inet_pton для преобразования строки в структуру in6_addr .

#include <arpa/inet.h>

  ...

const char *ip6str = "::2";
struct in6_addr result;

if (inet_pton(AF_INET6, ip6str, &result) == 1) // success!
{
    //successfully parsed string into "result"
}
else
{
    //failed, perhaps not a valid representation of IPv6?
}
13
ответ дан 3 December 2019 в 03:04
поделиться

Для синтаксического анализа IPv6 на языке C вам необходимо создать служебную функцию, которая токенизирует строку (двоеточие для шестнадцатеричных блоков и косая черта для битов подсети).

  1. Разметить необработанную строку IPv6 на подстроку меньшего размера.
  2. Преобразование непустой подстроки в шестнадцатеричные блоки. (Преобразование ASCII в десятичное)
  3. Расширить шестнадцатеричный блок до 2-х байтов, добавив ноль перед ним. (обрезаются только ведущие нули)
  4. Полный IPv6 должен иметь 8 шестнадцатеричных блоков, вычислить недостающие шестнадцатеричные блоки. (группировка нулей может произойти только один раз)
  5. Повторно вставить отсутствующий шестнадцатеричный блок. (используйте индекс пустой подстроки)
2
ответ дан 3 December 2019 в 03:04
поделиться

getaddrinfo() может понимать IPv6-адреса. Передайте ему AF_INET6 в подсказках, а также AI_NUMERICHOST (чтобы предотвратить поиск DNS). В Linux он есть, у Windows он есть как у Windows XP.

10
ответ дан 3 December 2019 в 03:04
поделиться
Другие вопросы по тегам:

Похожие вопросы: