Inet pton: примеры (PHP)

Преобразование сетевых адресов функцией inet_pton
Раздел: Сетевые функции
inet_pton(string $ip): string|false

Описание функции inet_pton

Функция inet_pton в PHP преобразует IP-адрес из человекочитаемого строкового представления в упакованное двоичное представление. Она используется для работы с сетевыми адресами, особенно когда требуется сравнивать IP-адреса, хранить их в компактном виде или выполнять сетевые операции.

Аргументы функции

Функция принимает один обязательный параметр:

  • ip (string) - IP-адрес в формате IPv4 или IPv6 в виде строки.

Возвращаемое значение: двоичная строка длиной 4 байта для IPv4 или 16 байт для IPv6. При ошибке возвращается false.

Примеры использования

Преобразование IPv4 адреса
$ipv4 = '192.168.1.1';
$result = inet_pton($ipv4);
echo bin2hex($result);
c0a80101
Преобразование IPv6 адреса
$ipv6 = '2001:0db8:85a3:0000:0000:8a2e:0370:7334';
$result = inet_pton($ipv6);
echo bin2hex($result);
20010db885a3000000008a2e03707334
Обработка сокращенного IPv6
$ipv6_short = '::1';
$result = inet_pton($ipv6_short);
echo bin2hex($result);
00000000000000000000000000000001
Некорректный адрес
$invalid = 'not.an.ip';
$result = inet_pton($invalid);
var_dump($result);
bool(false)

Похожие функции в PHP

Выполняет обратное преобразование: из двоичного представления в строковое. Применяется вместе с inet_pton для двустороннего преобразования.

ip2long и long2ip

Работают только с IPv4 адресами, преобразуя их в целые числа и обратно. Менее эффективны для хранения, но удобны для числовых операций.

filter_var

С фильтром FILTER_VALIDATE_IP проверяет корректность IP-адреса. Не преобразует адрес, но обеспечивает валидацию.

Типичные ошибки

Передача некорректного формата адреса
$result = inet_pton('256.300.500.600');
if ($result === false) {
    echo 'Некорректный IP-адрес';
}
Некорректный IP-адрес
Использование результата без проверки
$binary = inet_pton('invalid');
echo strlen($binary);  // Ошибка, если false
Warning: strlen() expects parameter 1 to be string, bool given
Сравнение двоичных строк через ==
$ip1 = inet_pton('192.168.001.001');
$ip2 = inet_pton('192.168.1.1');
var_dump($ip1 == $ip2);
bool(true)

Для точного сравнения лучше использовать оператор ===.

Изменения в последних версиях PHP

В PHP 8 функция inet pton не претерпела значительных изменений. Основное поведение сохранилось с предыдущих версий. В PHP 7 и 8 улучшена обработка ошибок для некорректных IPv6 адресов.

PHP 8.1

Не было внесено изменений, влияющих на работу функции.

Расширенные примеры

Сравнение IP-адресов
Пример php
function compareIPs($ip1, $ip2) {
    return inet_pton($ip1) === inet_pton($ip2);
}
echo compareIPs('192.168.01.001', '192.168.1.1') ? 'true' : 'false';
true
Проверка принадлежности к сети IPv6
Пример php
function inIPv6Subnet($ip, $subnet, $prefix) {
    $ipBin = inet_pton($ip);
    $subnetBin = inet_pton($subnet);
    $mask = str_repeat('f', $prefix / 4);
    if ($prefix % 4) $mask .= dechex(15 << (4 - ($prefix % 4)));
    $mask = hex2bin(str_pad($mask, 32, '0'));
    return ($ipBin & $mask) === ($subnetBin & $mask);
}
echo inIPv6Subnet('2001:db8::1', '2001:db8::', 64) ? 'true' : 'false';
true
Хранение IP в базе данных
Пример php
$ip = '10.0.0.1';
$binary = inet_pton($ip);
// Для MySQL: использование типа VARBINARY(16)
$stmt = $pdo->prepare('INSERT INTO logs (ip) VALUES (?)');
$stmt->bindParam(1, $binary, PDO::PARAM_LOB);
Определение типа IP-адреса
Пример php
function getIPVersion($ip) {
    $bin = inet_pton($ip);
    if ($bin === false) return 'invalid';
    return strlen($bin) === 4 ? 'IPv4' : 'IPv6';
}
echo getIPVersion('::1');
IPv6
Преобразование для системных вызовов
Пример php
$ip = '192.168.1.1';
$binary = inet_pton($ip);
$in_addr = unpack('N', $binary);
// Для использования в socket_connect и подобных функциях

Аналоги в других языках

Inet pton в Python

import socket
result = socket.inet_pton(socket.AF_INET, '192.168.1.1')
print(result.hex())
c0a80101

В Python требуется явно указывать семейство адресов (AF_INET или AF_INET6).

Inet pton в Javascript

// Нет прямой функции, но для IPv4:
function inetPton(ip) {
    return new Uint8Array(ip.split('.').map(Number));
}
console.log(inetPton('192.168.1.1'));
Uint8Array(4) [ 192, 168, 1, 1 ]

Inet pton в MySQL

SELECT HEX(INET6_ATON('2001:db8::1'));
20010DB8000000000000000000000001

INET6_ATON работает с обоими версиями IP, аналогично INET_ATON для IPv4.

PHP inet_pton function comments

En
Inet pton Converts a human readable IP address to its packed in_addr representation