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

Использование getservbyport для получения имени сетевой службы
Раздел: Сетевые функции
getservbyport(int $port, string $protocol): string|false
Основы функции getservbyport

Функция getservbyport в PHP возвращает название сетевой службы, соответствующей указанному порту и протоколу. Она используется для получения информации о стандартных сетевых службах, определённых в файле /etc/services в Unix-подобных системах или в системных реестрах Windows.

Аргументы функции
  • $port (int) - Номер порта службы.
  • $protocol (string) - Название протокола. Обычно "tcp" или "udp".

Функция возвращает строку с именем службы или false, если служба не найдена.

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

Поиск службы для порта 80 по протоколу tcp.

$service = getservbyport(80, "tcp");
echo $service;
http
Пример для UDP
$service = getservbyport(53, "udp");
echo $service;
domain
Пример с несуществующей службой
$result = getservbyport(99999, "tcp");
var_dump($result);
bool(false)
Похожие функции в PHP
  • 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
Служба:
Изменения в последних версиях PHP

Функция getservbyport остаётся стабильной и практически неизменной на протяжении многих версий PHP, включая PHP 8.x. Значительных изменений в поведении или сигнатуре функции не было. Функция относится к расширению стандартных функций PHP, которое обычно не претерпевает частых модификаций.

Расширенные примеры
Проверка диапазона портов

Скрипт проверяет, какие порты в определённом диапазоне имеют зарегистрированные службы для TCP.

Пример php
for ($port = 70; $port <= 90; $port++) {
    $service = getservbyport($port, "tcp");
    if ($service !== false) {
        echo "Порт $port: $service" . PHP_EOL;
    }
}
Порт 80: http
Порт 88: kerberos
Сравнение TCP и UDP для одного порта
Пример php
$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
Использование с пользовательским вводом (с проверкой)
Пример php
$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
Формирование справочной таблицы
Пример php
$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
Node.js (JavaScript)

Встроенный модуль dns не предоставляет прямой аналог. Часто используют внешние пакеты или константы.

Getservbyport в MySQL

Прямого аналога не существует. Информация о службах обычно находится вне компетенции СУБД.

Основное отличие PHP-функции в её простоте и прямом доступе к системной информации без необходимости обработки исключений в стиле Python.

PHP getservbyport function comments

En
Getservbyport Get Internet service which corresponds to port and protocol