Getservbyport: примеры (PHP)
getservbyport(int $port, string $protocol): string|falseФункция getservbyport в PHP возвращает название сетевой службы, соответствующей указанному порту и протоколу. Она используется для получения информации о стандартных сетевых службах, определённых в файле /etc/services в Unix-подобных системах или в системных реестрах Windows.
- $port (int) - Номер порта службы.
- $protocol (string) - Название протокола. Обычно "tcp" или "udp".
Функция возвращает строку с именем службы или false, если служба не найдена.
Поиск службы для порта 80 по протоколу tcp.
$service = getservbyport(80, "tcp");
echo $service;http
$service = getservbyport(53, "udp");
echo $service;domain
$result = getservbyport(99999, "tcp");
var_dump($result);bool(false)
- getservbyname - Выполняет обратную операцию: получает номер порта по имени службы и протоколу. Удобна, когда известно имя службы, а не порт.
- getprotobyname и getprotobynumber - Работают с протоколами, возвращая номер по имени или имя по номеру соответственно. Полезны для работы с IP-протоколами.
- gethostbyaddr и gethostbyname - Функции для разрешения имён хостов и IP-адресов, относящиеся к другому уровню сетевых операций.
Выбор функции зависит от направления поиска: от порта к имени (getservbyport) или от имени к порту (getservbyname).
Передача числового порта в виде строки может вызвать предупреждение, но часто работает из-за неявного приведения типов в PHP.
$service = getservbyport("80", "tcp"); // Неявное приведение "80" к 80
echo $service;http
Указание неизвестного протокола приводит к возврату false.
$result = getservbyport(80, "icmp");
var_dump($result);bool(false)
Ошибкой считается не проверять результат на false, если возможен вариант отсутствия службы.
$service = getservbyport(12345, "tcp");
echo "Служба: " . $service; // Выведет "Служба: " при falseСлужба:
Функция getservbyport остаётся стабильной и практически неизменной на протяжении многих версий PHP, включая PHP 8.x. Значительных изменений в поведении или сигнатуре функции не было. Функция относится к расширению стандартных функций PHP, которое обычно не претерпевает частых модификаций.
Скрипт проверяет, какие порты в определённом диапазоне имеют зарегистрированные службы для TCP.
for ($port = 70; $port <= 90; $port++) {
$service = getservbyport($port, "tcp");
if ($service !== false) {
echo "Порт $port: $service" . PHP_EOL;
}
}Порт 80: http Порт 88: kerberos
$port = 53;
$tcpService = getservbyport($port, "tcp");
$udpService = getservbyport($port, "udp");
echo "Порт $port TCP: " . ($tcpService ?: 'Не найдено') . PHP_EOL;
echo "Порт $port UDP: " . ($udpService ?: 'Не найдено') . PHP_EOL;Порт 53 TCP: domain Порт 53 UDP: domain
$userPort = '80';
$userProto = 'tcp';
if (is_numeric($userPort) && in_array($userProto, ['tcp', 'udp', 'sctp', 'dccp'])) {
$service = getservbyport((int)$userPort, $userProto);
echo $service !== false ? "Служба: $service" : "Служба не зарегистрирована";
} else {
echo "Некорректные входные данные";
}Служба: http
$commonPorts = [21, 22, 23, 25, 53, 80, 110, 143, 443, 3306];
echo "Порт | TCP-служба | UDP-служба" . PHP_EOL;
echo str_repeat("-", 30) . PHP_EOL;
foreach ($commonPorts as $port) {
$tcp = getservbyport($port, "tcp") ?: 'N/A';
$udp = getservbyport($port, "udp") ?: 'N/A';
printf("%4d | %-10s | %-10s" . PHP_EOL, $port, $tcp, $udp);
}Порт | TCP-служба | UDP-служба ------------------------------ 21 | ftp | ftp 22 | ssh | ssh 23 | telnet | telnet 25 | smtp | smtp 53 | domain | domain 80 | http | http 110 | pop3 | pop3 143 | imap | imap 443 | https | https 3306 | mysql | N/A
Getservbyport в Python
Используется модуль socket.
import socket
try:
service = socket.getservbyport(80, "tcp")
print(service)
except OSError:
print("Служба не найдена")http
Встроенный модуль dns не предоставляет прямой аналог. Часто используют внешние пакеты или константы.
Getservbyport в MySQL
Прямого аналога не существует. Информация о службах обычно находится вне компетенции СУБД.
Основное отличие PHP-функции в её простоте и прямом доступе к системной информации без необходимости обработки исключений в стиле Python.