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

Работа с сетевыми сервисами через getservbyname в PHP
Раздел: Сетевые функции
getservbyname(string $service, string $protocol): int|false

Функция getservbyname в PHP

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

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

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

  • service (строка) — имя сетевого сервиса, например 'http', 'ftp', 'smtp'.
  • protocol (строка) — название протокола, обычно 'tcp' или 'udp'.

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

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

Базовое получение порта
<?
$http_port = getservbyname('http', 'tcp');
echo $http_port;
?>
80
Попытка получить порт для UDP сервиса
<?
$dns_port = getservbyname('domain', 'udp');
echo $dns_port;
?>
53
Обработка случая, когда сервис не найден
<?
$unknown = getservbyname('unknownservice', 'tcp');
var_dump($unknown);
?>
bool(false)

Альтернативные функции в PHP

Функция getservbyport() выполняет обратную операцию — получает имя сервиса по номеру порта и протоколу. Её используют, когда известен порт, но нужно определить соответствующий сервис.

Когда что использовать

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

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

Использование неправильного регистра
<?
$port = getservbyname('HTTP', 'TCP'); // Использование верхнего регистра
var_dump($port);
?>
bool(false)

Имена сервисов и протоколов чувствительны к регистру. Нужно использовать нижний регистр.

Неправильный порядок аргументов
<?
$port = getservbyname('tcp', 'http'); // Аргументы перепутаны
var_dump($port);
?>
bool(false)

Первый аргумент — имя сервиса, второй — протокол.

Изменения в последних версиях PHP

Функция getservbyname() остаётся стабильной в PHP 8. Значительных изменений в поведении или синтаксисе не было. Однако в PHP 8 усилилась строгость типов, что может повлиять на передаваемые аргументы.

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

Проверка доступности стандартных портов
Пример php
<?
$services = [
    ['http', 'tcp'],
    ['https', 'tcp'],
    ['ftp', 'tcp'],
    ['ssh', 'tcp'],
    ['smtp', 'tcp']
];

foreach ($services as $service) {
    $port = getservbyname($service[0], $service[1]);
    if ($port !== false) {
        echo "Сервис {$service[0]} использует порт: $port\n";
    }
}
?>
Сервис http использует порт: 80
Сервис https использует порт: 443
Сервис ftp использует порт: 21
Сервис ssh использует порт: 22
Сервис smtp использует порт: 25
Создание справочника портов
Пример php
<?
function getServicePortMap($protocol = 'tcp') {
    $commonServices = ['http', 'ftp', 'ssh', 'telnet', 'smtp', 'dns'];
    $map = [];
    
    foreach ($commonServices as $service) {
        $port = getservbyname($service, $protocol);
        if ($port !== false) {
            $map[$service] = $port;
        }
    }
    
    return $map;
}

print_r(getServicePortMap());
?>
Array
(
    [http] => 80
    [ftp] => 21
    [ssh] => 22
    [telnet] => 23
    [smtp] => 25
    [dns] => 53
)
Интеграция с сетевыми операциями
Пример php
<?
$service = 'http';
$protocol = 'tcp';
$port = getservbyname($service, $protocol);

if ($port !== false) {
    $host = 'example.com';
    $address = gethostbyname($host);
    
    if ($address !== $host) {
        echo "Попытка подключения к $service://$host:$port ($address)\n";
        // Здесь может быть код установки соединения
    }
}
?>
Попытка подключения к http://example.com:80 (93.184.216.34)

Аналоги в других языках программирования

Python: socket.getservbyname
import socket
port = socket.getservbyname('http', 'tcp')
print(port)
80
JavaScript (Node.js)

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

Getservbyname в MySQL

Прямого аналога нет. Сетевые функции в MySQL в основном предназначены для управления подключениями, а не разрешения имён служб.

PHP getservbyname function comments

En
Getservbyname Get port number associated with an Internet service and protocol