PHP getservbyport 函数
最后修改于 2025 年 4 月 4 日
PHP 的 getservbyport
函数通过端口号和协议查找网络服务。它有助于识别在特定端口上运行的服务。
基本定义
getservbyport
返回与端口和协议关联的 Internet 服务。它会检查系统的服务数据库(通常是 /etc/services)。
语法:getservbyport(int $port, string $protocol): string|false
。返回服务名称,如果找不到则返回 false。需要网络函数支持。
基本端口查找
此示例演示了如何通过常用网络服务的端口号进行查找。
<?php declare(strict_types=1); $service = getservbyport(80, "tcp"); echo "Port 80: " . ($service ?: "Unknown service");
此代码检查端口 80 和 TCP 协议,这通常用于 HTTP。如果服务已注册,该函数在大多数系统上会返回 "www" 或 "http"。
检查多个端口
此示例检查多个知名端口,以演示不同的服务。
<?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)。结果取决于系统的服务配置。
协议比较
此示例展示了协议如何影响相同端口号的服务查找。
<?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),而有些服务则仅限于特定协议。此示例演示了检查两种协议以进行比较。
服务验证函数
此代码创建一个函数来验证端口是否与已知服务相关联。
<?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。
<?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));
此代码扫描多个端口并返回它们关联的服务。请注意,这仅检查服务数据库,而不检查实际的网络连接或开放端口。
最佳实践
- 错误处理:始终检查 false 返回值
- 协议特异性:明确指定 TCP/UDP 协议
- 端口范围:记住有效端口是 0-65535
- 系统差异:结果因操作系统/服务文件而异
来源
本教程通过实际示例介绍了 PHP 的 getservbyport
函数,用于通过端口号和协议查找网络服务。
作者
列出 所有 PHP 网络函数。