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
<?
$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 усилилась строгость типов, что может повлиять на передаваемые аргументы.
Расширенные примеры использования
<?
$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
<?
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
)<?
$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)
Аналоги в других языках программирования
import socket
port = socket.getservbyname('http', 'tcp')
print(port)80
В Node.js используют модуль dns для разрешения служб, но прямой аналог отсутствует. Обычно порты указывают явно или используют константы.
Getservbyname в MySQL
Прямого аналога нет. Сетевые функции в MySQL в основном предназначены для управления подключениями, а не разрешения имён служб.