ZetCode

PHP getprotobynumber 函数

最后修改于 2025 年 4 月 4 日

PHP getprotobynumber 函数通过协议号查找协议名称。它对于网络编程和协议分析非常有用。

基本定义

getprotobynumber 返回与协议号关联的协议名称。它会检查系统的协议数据库(在类 Unix 系统上是 /etc/protocols)。

语法:getprotobynumber(int $number): string|false。如果找不到,则返回协议名称或 false。需要网络支持。

基本协议查找

本示例演示了通过标准协议号查找协议名称。

basic_lookup.php
<?php

declare(strict_types=1);

$protocolNumber = 6;
$protocolName = getprotobynumber($protocolNumber);

if ($protocolName !== false) {
    echo "Protocol number $protocolNumber is $protocolName";
} else {
    echo "Protocol number $protocolNumber not found";
}

这会查找协议号 6,也就是 TCP。如果该协议号在系统的协议数据库中找到,该函数将返回其名称。

检查常用协议

本示例检查几个常用协议号并显示它们的名称。

common_protocols.php
<?php

declare(strict_types=1);

$protocols = [
    1 => "ICMP",
    6 => "TCP",
    17 => "UDP",
    58 => "ICMPv6"
];

foreach ($protocols as $number => $expected) {
    $name = getprotobynumber($number);
    echo "$number: " . ($name === $expected ? "OK" : "Mismatch") . "\n";
}

这会验证标准协议号与预期名称是否匹配。它有助于验证系统协议数据库的内容。

处理未知协议

本示例展示了如何处理无法识别协议号的情况。

unknown_protocol.php
<?php

declare(strict_types=1);

$unknownNumber = 255;
$protocolName = getprotobynumber($unknownNumber);

if ($protocolName === false) {
    echo "Protocol number $unknownNumber is unknown";
} else {
    echo "Protocol number $unknownNumber is $protocolName";
}

对于未知协议号,该函数返回 false。本示例演示了如何妥善处理此类情况的错误。

协议分析函数

这展示了一个用于分析网络数据中协议号的完整函数。

protocol_analyzer.php
<?php

declare(strict_types=1);

function analyzeProtocol(int $number): string {
    $name = getprotobynumber($number);
    
    if ($name === false) {
        return "Unknown protocol ($number)";
    }
    
    return "$name ($number)";
}

echo analyzeProtocol(17); // UDP
echo "\n";
echo analyzeProtocol(99); // Unknown

此函数提供了一种标准化的方式来显示协议信息。它可以优雅地处理已知和未知协议号。

构建协议参考

本示例构建了一个协议号和名称的参考表。

protocol_reference.php
<?php

declare(strict_types=1);

$protocolNumbers = range(0, 30);
echo "Protocol Number Reference:\n";

foreach ($protocolNumbers as $number) {
    $name = getprotobynumber($number);
    echo sprintf("%3d: %s\n", $number, $name ?? "Not assigned");
}

这会生成一个从 0 到 30 的协议号参考表。它展示了如何系统地检查协议号的分配。

最佳实践

来源

PHP getprotobynumber 文档

本教程通过网络编程中协议号查找的实际示例,介绍了 PHP getprotobynumber 函数。

作者

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

列出 所有 PHP 网络函数