Getprotobynumber: примеры (PHP)
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)
Наиболее близкой функцией является getprotobyname(). Она выполняет обратную операцию: преобразует строковое имя протокола в его номер.
<?php
$protocolNumber = getprotobyname('icmp');
echo $protocolNumber; // Выведет 1
?>Предпочтительнее использовать getprotobynumber(), когда исходные данные представляют собой номер (например, из заголовка IP-пакета). Функцию getprotobyname() применяют, когда известено имя протокола и требуется получить его числовой идентификатор для системных вызовов.
Основная ошибка — передача в функцию аргумента некорректного типа или несуществующего номера протокола без последующей проверки результата.
<?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
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();
}
?><?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
)<?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 для подобных преобразований используется модуль socket.
import socket
try:
protocol_name = socket.getprotobynumber(6)
print(protocol_name) # tcp
except OSError:
print("Протокол не найден")В Node.js прямого аналога нет. Обычно используют внешние библиотеки или создают собственное сопоставление на основе системного файла.
В СУБД MySQL подобная низкоуровневая сетевая функциональность отсутствует.