Комментарии: Как работать с IPv6 в PHP https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/ Случаи из опыта разработки различных WEB проектов. Интересные факты, статьи, впечатления. Программирование и все о нем в сфере WEB. Mon, 05 Feb 2024 00:43:25 +0000 hourly 1 https://wordpress.org/?v=6.6.1 Автор: Иван https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-67896 Mon, 05 Feb 2024 00:43:25 +0000 http://intsystem.org/?p=1613#comment-67896 Цитирование порезало код. Но прочитать несложно
if (inet_pton( $ip6 ) == current(unpack( «A16», inet_pton( $ip6 ) ))) {
echo ‘==’;
} else {
echo ‘!=’;
}
——————————————————
$ip = inet_pton(«fe80:1:2:3:a:bad:1dea:dad»);
$mask = inet_pton(«ffff:ffff:ffff:ffff:ffff:fff0::»);

echo »;
var_dump( inet_ntop( $ip & $mask ) );
echo »;
var_dump( inet_ntop( $ip | ~ $mask ) );

]]>
Автор: Иван https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-67895 Mon, 05 Feb 2024 00:42:10 +0000 http://intsystem.org/?p=1613#comment-67895 привет. спасибо за статью. у меня прекрасно работает всё без использования pack.
например, эти значения равны:

if (inet_pton( $ip6 ) == current(unpack( «A16», inet_pton( $ip6 ) ))) {
echo ‘==’;
} else {
echo ‘!=’;
}

здесь побитовые операции тоже выполняются корректно:

$ip = inet_pton(«fe80:1:2:3:a:bad:1dea:dad»);
$mask = inet_pton(«ffff:ffff:ffff:ffff:ffff:fff0::»);

echo »;
var_dump( inet_ntop( $ip & $mask ) );
echo »;
var_dump( inet_ntop( $ip | ~ $mask ) );

]]>
Автор: Sept https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-32590 Tue, 05 Jun 2018 17:18:11 +0000 http://intsystem.org/?p=1613#comment-32590 В ответ на Radeon.

Ну, регулярками я никогда не пользовался, конечно. Ибо связка ip2long -> long2ip работает быстрее и надёжнее.
Но фишка с filter_var явилась для меня новостью и действительно бесподобна. Работает почти втрое шустрее других вариантов и на порядок нагляднее.
Век живи — век учись :)

]]>
Автор: Андрей https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-24816 Sun, 16 Oct 2016 09:20:25 +0000 http://intsystem.org/?p=1613#comment-24816 В ответ на Андрей.

Уже понял, можете удалить комментарий.

]]>
Автор: Андрей https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-24802 Sat, 15 Oct 2016 16:29:59 +0000 http://intsystem.org/?p=1613#comment-24802 Здравствуйте! Можете привести пример как делать выборки в БД по диапазонам IPv6, используя BINARY(16)?

Заранее спасибо.

]]>
Автор: Дмитрий Амиров https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-23310 Wed, 17 Feb 2016 17:28:16 +0000 http://intsystem.org/?p=1613#comment-23310 В ответ на X111.

Рад что смог помочь. С ipv6 работы не на полчаса, а однозначно поболее) хотя зря вы ждали несколько дней, надо было сразу мне написать

]]>
Автор: X111 https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-23309 Wed, 17 Feb 2016 16:41:25 +0000 http://intsystem.org/?p=1613#comment-23309 В ответ на Дмитрий Амиров.

Спасибо, что прояснили ситуацию! Просто человек, который выдал это задание, сказал, что его выполнение займёт полчаса. Для IPV4 заняло 15 минут. А с IPV6 уже несколько дней возился, потом решил Вам написать. Спасибо ещё раз.

]]>
Автор: Дмитрий Амиров https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-23301 Tue, 16 Feb 2016 09:50:41 +0000 http://intsystem.org/?p=1613#comment-23301 В ответ на X111.

Вместо двоичных чисел вы получили байтовое представление IP адреса. Т.е. чтобы получить двоичное представление из этой строки вам нужно каждый байт преобразовать в двоичный вид.

А вообще по поводу вашей задачи — тут не все так просто. PHP не может оперировать с представлением IPv6 в виде числа даже на 64 битовых системах. Одно из решений ставить на сервер http://php.net/manual/ru/book.gmp.php либо же делать аналог своими средставами (а именно функции сравнения, сложения, вычитания).

]]>
Автор: X111 https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-23300 Tue, 16 Feb 2016 09:36:24 +0000 http://intsystem.org/?p=1613#comment-23300 Здравствуйте! Извините, если мой вопрос покажется слишком примитивным. Я пишу функцию, которая имеет два входных параметра — начальный IP и конечный IP. IP адреса могут быть ipv4, ipv6.
Функция должна выводить список всех IP адресов, которые помещаются в указанный диапазон. С IPV4 — никаких проблем не было, а вот с IPV6 вывод не получается. Вот код функции, который выполняется правильно, для IPV4:

     function output_list_ip($ip_First, $ip_Last)
      {
         if(filter_var($ip_First, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4) && 
	     filter_var($ip_Last, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4))
	    {
	      $ip_First=ip2long($ip_First);
              $ip_Last=ip2long($ip_Last);
              $dif=$ip_Last-$ip_First;
              for($i=0; $i<=$dif; $i++) echo long2ip($ip_First+$i).'';
	    }
	 elseif(filter_var($ip_First, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6) && 
	           filter_var($ip_Last, FILTER_VALIDATE_IP, FILTER_FLAG_IPV6))
	    {
		  //
	    }
	else echo "Данные, переданные функции, не соответствуют ip-адресам IPV4 или IPV6. ";  
      }

Для IPV6 я попробовал, для начала, с помощью inet_pton() перевести входные параметры в двоичные числа. Но вместо двоичных чисел получил какую-то хр*нь.

Может быть, Вы объясните чайнику, как реализовать оставшуюся часть функции.
Спасибо за статью, и извините, если время отнял.

]]>
Автор: Дмитрий Амиров https://intsystem.org/coding/kak-rabotat-s-ipv6-v-php/#comment-22568 Sun, 15 Nov 2015 00:39:09 +0000 http://intsystem.org/?p=1613#comment-22568 В ответ на Radeon.

Да я вот с трудом представлял с какой стороны подходить к ipv6, пришлось вот статейку английскую нагуглить, да и перевел заодно.

Насчет подсказок знаю, все никак руки не дойдут перевести) спасибо

]]>