Getprotobyname: примеры (PHP)
getprotobyname(string $protocol): int|falseФункция getprotobyname() в PHP возвращает номер протокола, соответствующий указанному имени протокола из системного файла /etc/protocols или его аналога в Windows. Она применяется в сетевом программировании для преобразования символического имени протокола в его числовой идентификатор, требуемый некоторыми сетевыми функциями, например, при создании сокетов.
Функция принимает один обязательный аргумент:
- name (string) – Строка, содержащая имя протокола, например,
"tcp","udp","icmp".
Возвращаемое значение: целое число (номер протокола) или false, если указанное имя не найдено в системной базе.
Получение номера для протокола TCP.
<?php
$protocolNumber = getprotobyname('tcp');
echo $protocolNumber;
?>6
Получение номера для протокола UDP.
<?php
$protocolNumber = getprotobyname('udp');
echo $protocolNumber;
?>17
Попытка получить номер для неизвестного протокола.
<?php
$result = getprotobyname('unknown_protocol');
var_dump($result);
?>bool(false)
Функция getprotobynumber() выполняет обратную операцию – возвращает имя протокола по его номеру. Ее используют, когда известен числовой идентификатор.
Функции getservbyname() и getservbyport() работают с сервисами и портами, возвращая номер порта по имени сервиса и протокола или наоборот. Они полезны для преобразования имен сервисов (например, 'http') в номера портов.
Выбор функции зависит от задачи: getprotobyname применяется для работы с протоколами сетевого уровня (IP, ICMP) или транспортного (TCP, UDP), в то время как getservbyname предназначена для портов прикладного уровня.
Имена протоколов чувствительны к регистру. Передача имени в неправильном регистре может вернуть false.
<?php
$result = getprotobyname('Tcp'); // Должно быть 'tcp'
var_dump($result);
?>bool(false)
Попытка использовать возвращенное значение как число, когда функция вернула false, может привести к неожиданному поведению.
<?php
$proto = getprotobyname('wrong_name');
echo $proto + 10; // Ошибка, если $proto = false
?>10
В этом примере false преобразуется в 0, что может быть неочевидно. Рекомендуется проверять результат на false перед использованием.
В PHP 8 существенных изменений в поведении функции getprotobyname() не произошло. Функция сохранила обратную совместимость. Однако, в целом, для PHP 8 характерны более строгие проверки типов, но поскольку функция принимает только строковый аргумент, это не повлияло на ее работу.
Номер протокола может потребоваться при использовании низкоуровневых сокетов.
<?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
Функция удобна для проверки корректности имени протокола перед его использованием.
<?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: нет
Демонстрация взаимосвязи функций getprotobyname и getprotobynumber.
<?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
В Node.js подобная функциональность доступна через модуль dns или net, но прямого аналога нет. Часто номера протоколов задаются константами вручную или используются сторонние библиотеки.
Getprotobyname в MySQL
В MySQL нет прямой аналогичной функции, так как это СУБД, а не язык для сетевых операций. Информация о протоколах может храниться в таблицах, но это зависит от реализации приложения.