ZetCode

PHP getservbyport 函数

最后修改于 2025 年 4 月 4 日

PHP 的 getservbyport 函数通过端口号和协议查找网络服务。它有助于识别在特定端口上运行的服务。

基本定义

getservbyport 返回与端口和协议关联的 Internet 服务。它会检查系统的服务数据库(通常是 /etc/services)。

语法:getservbyport(int $port, string $protocol): string|false。返回服务名称,如果找不到则返回 false。需要网络函数支持。

基本端口查找

此示例演示了如何通过常用网络服务的端口号进行查找。

basic_lookup.php
<?php

declare(strict_types=1);

$service = getservbyport(80, "tcp");
echo "Port 80: " . ($service ?: "Unknown service");

此代码检查端口 80 和 TCP 协议,这通常用于 HTTP。如果服务已注册,该函数在大多数系统上会返回 "www" 或 "http"。

检查多个端口

此示例检查多个知名端口,以演示不同的服务。

multi_port_check.php
<?php

declare(strict_types=1);

$ports = [21, 22, 25, 53, 80, 443];
foreach ($ports as $port) {
    $service = getservbyport($port, "tcp");
    echo "Port $port: " . ($service ?: "Unknown") . "\n";
}

此代码检查常见端口,如 FTP (21)、SSH (22)、SMTP (25)、DNS (53) 和 HTTPS (443)。结果取决于系统的服务配置。

协议比较

此示例展示了协议如何影响相同端口号的服务查找。

protocol_comparison.php
<?php

declare(strict_types=1);

$port = 53;
$tcp_service = getservbyport($port, "tcp");
$udp_service = getservbyport($port, "udp");

echo "TCP: " . ($tcp_service ?: "None") . "\n";
echo "UDP: " . ($udp_service ?: "None") . "\n";

有些服务同时使用 TCP 和 UDP(如端口 53 上的 DNS),而有些服务则仅限于特定协议。此示例演示了检查两种协议以进行比较。

服务验证函数

此代码创建一个函数来验证端口是否与已知服务相关联。

service_validator.php
<?php

declare(strict_types=1);

function isKnownService(int $port, string $protocol): bool {
    return (bool) getservbyport($port, $protocol);
}

$port = 3306;
echo isKnownService($port, "tcp") ? "Known" : "Unknown";

此函数检查端口/协议组合是否具有已注册的服务。MySQL 通常使用端口 3306,该端口可能在服务文件中,也可能不在。

构建端口扫描器

此示例展示了如何在简单的端口扫描实用程序中使用 getservbyport。

port_scanner.php
<?php

declare(strict_types=1);

function scanPorts(array $ports, string $protocol = "tcp"): array {
    $results = [];
    foreach ($ports as $port) {
        $service = getservbyport($port, $protocol);
        $results[$port] = $service ?: "Unknown";
    }
    return $results;
}

$common_ports = [20, 21, 22, 23, 25, 53, 80, 110, 143, 443];
print_r(scanPorts($common_ports));

此代码扫描多个端口并返回它们关联的服务。请注意,这仅检查服务数据库,而不检查实际的网络连接或开放端口。

最佳实践

来源

PHP getservbyport 文档

本教程通过实际示例介绍了 PHP 的 getservbyport 函数,用于通过端口号和协议查找网络服务。

作者

我叫 Jan Bodnar,是一名充满热情的程序员,拥有丰富的编程经验。我自 2007 年以来一直在撰写编程文章。迄今为止,我已撰写了 1,400 多篇文章和 8 本电子书。我在编程教学方面拥有十多年的经验。

列出 所有 PHP 网络函数