Getprotobyname: примеры (PHP)

Использование getprotobyname в PHP для получения номера протокола
Раздел: Сетевые функции
getprotobyname(string $protocol): int|false
Описание функции getprotobyname

Функция getprotobyname() в PHP возвращает номер протокола, соответствующий указанному имени протокола из системного файла /etc/protocols или его аналога в Windows. Она применяется в сетевом программировании для преобразования символического имени протокола в его числовой идентификатор, требуемый некоторыми сетевыми функциями, например, при создании сокетов.

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

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

  • name (string) – Строка, содержащая имя протокола, например, "tcp", "udp", "icmp".

Возвращаемое значение: целое число (номер протокола) или false, если указанное имя не найдено в системной базе.

Короткие примеры использования
Пример 1: Базовое использование

Получение номера для протокола TCP.

<?php
$protocolNumber = getprotobyname('tcp');
echo $protocolNumber;
?>
6
Пример 2: Протокол UDP

Получение номера для протокола UDP.

<?php
$protocolNumber = getprotobyname('udp');
echo $protocolNumber;
?>
17
Пример 3: Несуществующий протокол

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

<?php
$result = getprotobyname('unknown_protocol');
var_dump($result);
?>
bool(false)
Похожие функции в PHP

Функция getprotobynumber() выполняет обратную операцию – возвращает имя протокола по его номеру. Ее используют, когда известен числовой идентификатор.

getservbyname и getservbyport

Функции getservbyname() и getservbyport() работают с сервисами и портами, возвращая номер порта по имени сервиса и протокола или наоборот. Они полезны для преобразования имен сервисов (например, 'http') в номера портов.

Выбор функции зависит от задачи: getprotobyname применяется для работы с протоколами сетевого уровня (IP, ICMP) или транспортного (TCP, UDP), в то время как getservbyname предназначена для портов прикладного уровня.

Типичные ошибки
Ошибка 1: Неправильный регистр имени

Имена протоколов чувствительны к регистру. Передача имени в неправильном регистре может вернуть false.

<?php
$result = getprotobyname('Tcp'); // Должно быть 'tcp'
var_dump($result);
?>
bool(false)
Ошибка 2: Использование результата без проверки

Попытка использовать возвращенное значение как число, когда функция вернула false, может привести к неожиданному поведению.

<?php
$proto = getprotobyname('wrong_name');
echo $proto + 10; // Ошибка, если $proto = false
?>
10

В этом примере false преобразуется в 0, что может быть неочевидно. Рекомендуется проверять результат на false перед использованием.

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

В PHP 8 существенных изменений в поведении функции getprotobyname() не произошло. Функция сохранила обратную совместимость. Однако, в целом, для PHP 8 характерны более строгие проверки типов, но поскольку функция принимает только строковый аргумент, это не повлияло на ее работу.

Расширенные примеры
Пример 1: Использование при создании сокета

Номер протокола может потребоваться при использовании низкоуровневых сокетов.

Пример php
<?php
$protocol = getprotobyname('tcp');
if ($protocol !== false) {
    // Создание сырого сокета (требуются соответствующие права)
    $socket = socket_create(AF_INET, SOCK_RAW, $protocol);
    if ($socket !== false) {
        echo 'Сокет создан с номером протокола: ' . $protocol;
        socket_close($socket);
    } else {
        echo 'Ошибка создания сокета';
    }
} else {
    echo 'Протокол не найден';
}
?>
Сокет создан с номером протокола: 6
Пример 2: Валидация имени протокола

Функция удобна для проверки корректности имени протокола перед его использованием.

Пример php
<?php
function isProtocolValid($protocolName) {
    return getprotobyname($protocolName) !== false;
}

$protocols = ['tcp', 'udp', 'icmp', 'invalid'];
foreach ($protocols as $proto) {
    echo $proto . ': ' . (isProtocolValid($proto) ? 'да' : 'нет') . "\n";
}
?>
tcp: да
udp: да
icmp: да
invalid: нет
Пример 3: Сравнение с getprotobynumber

Демонстрация взаимосвязи функций getprotobyname и getprotobynumber.

Пример php
<?php
$name = 'udp';
$number = getprotobyname($name);
$restoredName = getprotobynumber($number);

echo 'Имя: ' . $name . "\n";
echo 'Номер: ' . $number . "\n";
echo 'Восстановленное имя: ' . $restoredName . "\n";
?>
Имя: udp
Номер: 17
Восстановленное имя: udp
Альтернативы в других языках

Getprotobyname в Python

В Python для получения номера протокола используют модуль socket и функцию getprotobyname(). Поведение аналогично PHP.

import socket
protocol_num = socket.getprotobyname('tcp')
print(protocol_num)
6
JavaScript (Node.js)

В Node.js подобная функциональность доступна через модуль dns или net, но прямого аналога нет. Часто номера протоколов задаются константами вручную или используются сторонние библиотеки.

Getprotobyname в MySQL

В MySQL нет прямой аналогичной функции, так как это СУБД, а не язык для сетевых операций. Информация о протоколах может храниться в таблицах, но это зависит от реализации приложения.

PHP getprotobyname function comments

En
Getprotobyname Get protocol number associated with protocol name