ZetCode

PHP getprotobyname 函数

最后修改于 2025 年 4 月 4 日

PHP 的 getprotobyname 函数将协议名称转换为其相应的协议编号。它在网络编程中很有用。

基本定义

getprotobyname 在系统的协议数据库中查找协议名称。它返回与给定名称关联的协议编号。

语法:getprotobyname(string $name): int|false。返回协议编号,如果未找到则返回 false。需要正确的系统配置。

基本协议查找

此示例演示了将常用协议名称转换为其编号。

basic_lookup.php
<?php

declare(strict_types=1);

$protocol = "tcp";
$number = getprotobyname($protocol);

if ($number !== false) {
    echo "Protocol $protocol has number $number";
} else {
    echo "Protocol $protocol not found";
}

这会检查系统的协议数据库中 TCP 协议的编号。TCP 通常用于可靠的网络通信。

检查多个协议

此示例检查多个协议名称并显示它们的编号。

multi_protocol.php
<?php

declare(strict_types=1);

$protocols = ["tcp", "udp", "icmp", "ip"];

foreach ($protocols as $proto) {
    $num = getprotobyname($proto);
    echo "$proto: " . ($num !== false ? $num : "Not found") . "\n";
}

这提供了常用协议编号的快速参考。不同的协议在网络通信中服务于不同的目的。

错误处理

此示例显示了在找不到协议时的正确错误处理。

error_handling.php
<?php

declare(strict_types=1);

$protocol = "nonexistent";
$number = getprotobyname($protocol);

if ($number === false) {
    throw new RuntimeException("Protocol $protocol not found in database");
}

echo "Protocol number: $number";

当协议可能不存在时,请始终检查 false 返回值。这可以防止网络应用程序中的未定义行为。

套接字创建示例

这演示了在套接字创建中使用 getprotobyname

socket_creation.php
<?php

declare(strict_types=1);

$protocol = "tcp";
$proto_num = getprotobyname($protocol);

if ($proto_num === false) {
    die("Cannot get protocol number for $protocol");
}

$socket = socket_create(AF_INET, SOCK_STREAM, $proto_num);
if ($socket === false) {
    die("Socket creation failed: " . socket_strerror(socket_last_error()));
}

echo "TCP socket created successfully";

这展示了在需要协议编号进行套接字操作的网络编程中的实际应用。

协议验证函数

这创建了一个可重用的函数来验证协议名称。

protocol_validator.php
<?php

declare(strict_types=1);

function validateProtocol(string $name): bool {
    return getprotobyname($name) !== false;
}

$test_protocols = ["udp", "icmp", "fake_proto"];

foreach ($test_protocols as $proto) {
    $status = validateProtocol($proto) ? "valid" : "invalid";
    echo "$proto is $status\n";
}

此函数提供了一种在系统数据库中使用协议名称之前检查其是否存在的方法。

最佳实践

来源

PHP getprotobyname 文档

本教程通过在网络编程中进行协议名称到数字转换的实际示例,介绍了 PHP getprotobyname 函数。

作者

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

列出 所有 PHP 网络函数