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

Функция getprotobynumber: работа с сетевыми протоколами
Раздел: Сетевые функции
getprotobynumber(int $protocol): string|false

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

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

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

  • $protocol (int) – Целочисленный номер протокола, который необходимо преобразовать в имя.

Функция возвращает строку с именем протокола или false в случае, если указанный номер протокола не найден в системной базе данных (обычно файл /etc/protocols в Unix-подобных системах).

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

Пример с корректным номером протокола:

<?php
$protocolName = getprotobynumber(6);
echo $protocolName;
?>
tcp

Пример с другим номером:

<?php
$protocolName = getprotobynumber(17);
echo $protocolName;
?>
udp

Пример с неверным номером протокола:

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

Наиболее близкой функцией является getprotobyname(). Она выполняет обратную операцию: преобразует строковое имя протокола в его номер.

<?php
$protocolNumber = getprotobyname('icmp');
echo $protocolNumber; // Выведет 1
?>

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

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

Основная ошибка — передача в функцию аргумента некорректного типа или несуществующего номера протокола без последующей проверки результата.

Отсутствие проверки на false
<?php
$name = getprotobynumber(99999);
echo strtoupper($name); // Вызовет предупреждение, если $name=false
?>
PHP Warning:  strtoupper() expects parameter 1 to be string, bool given
Использование строкового аргумента вместо целого числа
<?php
$name = getprotobynumber('6'); // Строка будет преобразована в int
// Работает, но может ввести в заблуждение
?>

В последних основных версиях PHP (включая PHP 8.0, 8.1, 8.2, 8.3) функция getprotobynumber() не претерпела значимых изменений в своем сигнатуре или основном поведении. Функция остается стабильной и совместимой с предыдущими версиями.

Расширенные примеры применения
Обработка ошибок и ведение журнала
Пример php
<?php
function getProtocolNameSafe(int $number): string
{
    $result = getprotobynumber($number);
    if ($result === false) {
        // Можно записать в лог или выбросить исключение
        throw new InvalidArgumentException("Протокол с номером {$number} не найден.");
    }
    return $result;
}

try {
    echo getProtocolNameSafe(1) . "\n";  // icmp
    echo getProtocolNameSafe(255) . "\n"; // Выбросит исключение
} catch (Exception $e) {
    echo 'Ошибка: ',  $e->getMessage();
}
?>
Использование для анализа файла PCAP (концептуально)
Пример php
<?php
// Предположим, у нас есть массив номеров протоколов из заголовков пакетов
$protocolNumbers = [6, 17, 1, 6, 17];
$statistics = [];

foreach ($protocolNumbers as $num) {
    $name = getprotobynumber($num);
    if ($name !== false) {
        $statistics[$name] = ($statistics[$name] ?? 0) + 1;
    }
}

print_r($statistics);
?>
Array
(
    [tcp] => 2
    [udp] => 2
    [icmp] => 1
)
Комбинирование с getprotobyname для валидации
Пример php
<?php
function isProtocolNumberValid(int $num): bool
{
    $name = getprotobynumber($num);
    if ($name === false) return false;
    // Двойная проверка: преобразуем имя обратно в номер
    return getprotobyname($name) === $num;
}

var_dump(isProtocolNumberValid(6));  // bool(true)
var_dump(isProtocolNumberValid(999)); // bool(false)
?>
Аналоги в других языках программирования
Python

В Python для подобных преобразований используется модуль socket.

import socket
try:
    protocol_name = socket.getprotobynumber(6)
    print(protocol_name)  # tcp
except OSError:
    print("Протокол не найден")
JavaScript (Node.js)

В Node.js прямого аналога нет. Обычно используют внешние библиотеки или создают собственное сопоставление на основе системного файла.

MySQL

В СУБД MySQL подобная низкоуровневая сетевая функциональность отсутствует.

PHP getprotobynumber function comments

En
Getprotobynumber Get protocol name associated with protocol number