Я пытаюсь определить наиболее эффективный способ определения того, находится ли адрес IPv6 в пределах диапазона адресов (включая начальный и конечный адреса). Учитывая огромное количество адресов, которые могут потенциально существовать между начальным и конечным адресами, я, конечно же, не хочу перебирать диапазон в поисках совпадения.
Я получил несколько советов, которые пытались сделать это сопоставление диапазонов не является хорошим подходом, или не практичным / бесполезным для IPv6, и что вместо этого я должен рассмотреть сопоставление префиксов. Прежде чем идти по этому пути, я хотел бы посмотреть, какие эффективные решения могут существовать для определения, является ли адрес IPv6 заданным диапазоном.
Я не эксперт по сетевым технологиям, поэтому прошу прощения за некоторые мои незнания в этом Вопрос.
Я нашел это сообщение о переполнении стека с непринятым ответом, указывающим, что лучший способ сделать это - преобразовать все шестнадцатеричные значения адреса IPv6 в двоичный файл и затем выполнить сравнение. Две проблемы с этим постом: 1. Я не уверен, как адаптировать скрипт PHP в Objective- C, и 2. Этот ответ имеет некоторые положительные отзывы, но не является принятым ответом, поэтому я не уверен это стоит продолжить.
Я также нашел этот другой пост Переполнения стека, который, кажется, хорошо работает для преобразования шестнадцатеричных значений в двоичные, но, опять же, я не уверен, как сделать сравнение между результирующие двоичные значения для определения диапазона. Обратите внимание, что я использую пример кода из вопроса, а не ответа. Адаптация этого кода для моих целей дает мне вывод, подобный следующему, используя пример IPv6-адреса fe80::34cb:9850:4868:9d2c
:
fe80 = 1111111010000000
0000 = 0
0000 = 0
0000 = 0
34cb = 11010011001011
9850 = 1001100001010000
4868 = 100100001101000
9d2c = 1001110100101100
Конечный результат, которого я пытаюсь достичь, - это способность реагировать, когда Ma c ' s IP-адрес находится в пределах определенного диапазона. У меня есть решение для адресов IPv4, но я хочу добавить поддержку IPv6 в мое бесплатное приложение macOS, Amphetamine. Спасибо заранее за любую помощь. Это то, что я использую для проверки диапазона IPv4 ... не уверен, что он может быть адаптирован для использования с IPv6:
- (bool) ipAddress: (NSString *)ipAddress isBetweenIpAddress: (NSString *)rangeStart andIpAddress: (NSString *)rangeEnd
{
uint32_t ip = [self convertIpAddress: ipAddress];
uint32_t start = [self convertIpAddress: rangeStart];
uint32_t end = [self convertIpAddress: rangeEnd];
return ip >= start && ip <= end;
}
- (uint32_t) convertIpAddress: (NSString *) ipAddress
{
struct sockaddr_in sin;
inet_aton([ipAddress UTF8String], &sin.sin_addr);
return ntohl(sin.sin_addr.s_addr);
}