【PHP8.x】getservbyport()関数の使い方
getservbyport関数の使い方について、初心者にもわかりやすく解説します。
基本的な使い方
getservbyport関数は、指定されたポート番号とプロトコルに対応するサービスに関する情報を取得する関数です。この関数は、主にネットワークプログラミングにおいて、ポート番号から対応するサービス名やその他の詳細情報を検索するために利用されます。具体的には、/etc/servicesファイル(またはシステムが使用するサービスデータベース)を検索し、指定されたポート番号とプロトコルに一致するエントリを探します。
getservbyport関数は、2つの引数を取ります。1つ目の引数は、検索するポート番号です。この引数は整数で指定する必要があります。2つ目の引数は、プロトコル名を表す文字列です。一般的なプロトコルとしては、"tcp"や"udp"などがあります。
関数が成功した場合、サービスに関する情報を連想配列形式で返します。この配列には、サービス名、ポート番号、プロトコル名、エイリアスなどの情報が含まれます。関数が失敗した場合、つまり指定されたポート番号とプロトコルに一致するサービスが見つからない場合は、falseを返します。
システムエンジニアがネットワーク関連のアプリケーションを開発する際、getservbyport関数は、ポート番号とサービス名の対応関係を動的に解決するために役立ちます。例えば、特定のポートでリッスンしているサービスを特定したり、設定ファイルに記述されたサービス名からポート番号を取得したりする際に利用できます。セキュリティ上の理由から、/etc/servicesファイルの内容を信頼できない場合は、他の方法でサービス情報を取得することを検討する必要があります。
構文(syntax)
1getservbyport(int $port, string $protocol): string|false
引数(parameters)
int $port, string $protocol
- int $port: サービス名を取得したいポート番号を指定する整数
- string $protocol: 使用するネットワークプロトコルを指定する文字列(例: 'tcp'、'udp')
戻り値(return)
string|false
指定されたポート番号に対応するサービス名(文字列)を返します。ポート番号が見つからない場合は false を返します。
サンプルコード
PHP getservbyport() でサービス名を取得する
1<?php 2 3/** 4 * getservbyport() 関数を使用して、指定されたポート番号とプロトコルに対応する 5 * インターネットサービス名を取得し表示するサンプルスクリプトです。 6 * 7 * この関数は、TCP/UDPポートがどの一般的なサービス(例: HTTP, FTP, SSH)に 8 * 関連付けられているかを知りたい場合に役立ちます。 9 */ 10 11/** 12 * サービス情報を取得し表示する関数。 13 * 14 * @param int $port ポート番号 15 * @param string $protocol プロトコル (例: 'tcp', 'udp') 16 * @return void 17 */ 18function displayServiceInfo(int $port, string $protocol): void 19{ 20 echo "ポート {$port} (プロトコル: {$protocol}) のサービス名を取得中...\n"; 21 22 // getservbyport() 関数を呼び出し、サービス名を取得 23 // 成功した場合はサービス名(文字列)、失敗した場合は false を返します。 24 $serviceName = getservbyport($port, $protocol); 25 26 if ($serviceName !== false) { 27 echo " 成功: サービス名は '{$serviceName}' です。\n"; 28 } else { 29 // サービス名が見つからなかった、またはエラーが発生した場合 30 echo " 失敗: ポート {$port} ({$protocol}) に対応するサービス名が見つかりませんでした。\n"; 31 } 32 echo "\n"; 33} 34 35// いくつかの一般的なポートとプロトコルで試してみる 36displayServiceInfo(80, 'tcp'); // HTTP 37displayServiceInfo(443, 'tcp'); // HTTPS 38displayServiceInfo(21, 'tcp'); // FTP 39displayServiceInfo(22, 'tcp'); // SSH 40displayServiceInfo(53, 'udp'); // DNS (UDP) 41 42// 存在しない、または一般的なサービスが割り当てられていない可能性のあるポート 43displayServiceInfo(65535, 'tcp'); 44 45?>
PHPのgetservbyport()関数は、指定されたポート番号とプロトコルに対応するインターネットサービス名を取得するために使用されます。例えば、ウェブサービスでよく使われるポート80がHTTPサービスであるといった情報をプログラムから調べることができます。
この関数は二つの引数を取ります。一つ目の$portには、サービス名を調べたいポート番号を整数で指定します。二つ目の$protocolには、使用するプロトコルを文字列で指定し、通常は'tcp'または'udp'と記述します。
関数の戻り値は、サービス名が見つかった場合はそのサービス名を表す文字列です。もし対応するサービス名が見つからなかった場合や、何らかのエラーが発生した場合はfalseが返されます。
提供されたサンプルコードでは、displayServiceInfoという関数を使ってgetservbyport()の利用方法を示しています。この関数は、与えられたポートとプロトコルでgetservbyport()を呼び出し、戻り値がfalseでないかを確認しています。サービス名が取得できた場合はその名前を表示し、取得できなかった場合はその旨を画面に出力します。これにより、HTTPやHTTPS、SSHといった一般的なサービスがどのポート番号に関連付けられているかを確認できます。この関数は、ネットワーク関連のツール開発やシステム監視などで特定のポートが何のサービスに使われているかを知りたい場合に役立ちます。
getservbyport()関数は、指定ポートとプロトコルに対応するサービス名を取得します。戻り値は成功時にサービス名(文字列)、失敗時にfalseとなるため、!== falseで厳密なチェックが必須です。引数$protocolには'tcp'または'udp'を正確に指定してください。この関数が参照するサービス情報はシステム環境に依存し、全てのポートに標準サービス名が定義されているわけではありません。そのため、期待するサービス名が得られない場合がある点に留意し、エラーハンドリングを丁寧に行うことが大切です。特にネットワーク関連の情報取得では、実行環境の違いを意識するようにしましょう。
PHP getservbyport でポートからサービス名を取得する
1<?php 2 3declare(strict_types=1); 4 5/** 6 * 指定されたポート番号とプロトコルに基づいて、サービス名を取得し表示する関数。 7 * C言語のシステムプログラミングでも使われるgetservbyport関数のPHP版の利用例を示します。 8 * 9 * @param int $port ポート番号 (例: 80, 21, 22) 10 * @param string $protocol プロトコル (例: 'tcp', 'udp') 11 * @return void 12 */ 13function displayServiceByPort(int $port, string $protocol): void 14{ 15 // getservbyport関数は、指定されたポート番号とプロトコルに対応するサービス名を返します。 16 // サービス名が見つからない場合やエラーが発生した場合は false を返します。 17 $serviceName = getservbyport($port, $protocol); 18 19 if ($serviceName !== false) { 20 echo "ポート {$port}/{$protocol} のサービス名: {$serviceName}\n"; 21 } else { 22 // サービス名が取得できなかった場合の処理 23 echo "エラー: ポート {$port}/{$protocol} のサービス名を取得できませんでした。\n"; 24 } 25} 26 27// --- サンプル使用例 --- 28echo "--- 一般的なTCPサービスのポート ---\n"; 29// HTTPサービス (ポート80, TCP) 30displayServiceByPort(80, 'tcp'); 31// FTPサービス (ポート21, TCP) 32displayServiceByPort(21, 'tcp'); 33// SSHサービス (ポート22, TCP) - C言語のネットワークプログラミングでもよく扱われます 34displayServiceByPort(22, 'tcp'); 35// HTTPSサービス (ポート443, TCP) 36displayServiceByPort(443, 'tcp'); 37// SMTPサービス (ポート25, TCP) 38displayServiceByPort(25, 'tcp'); 39 40echo "\n--- 一般的なUDPサービスのポート ---\n"; 41// DNSサービス (ポート53, UDP) 42displayServiceByPort(53, 'udp'); 43// NTPサービス (ポート123, UDP) 44displayServiceByPort(123, 'udp'); 45 46echo "\n--- 存在しない可能性のあるポートや無効なプロトコルの例 ---\n"; 47// 未登録のポートの例 48displayServiceByPort(65535, 'tcp'); 49// 無効なプロトコルの例 50displayServiceByPort(1, 'invalid'); 51 52?>
PHP 8のgetservbyport関数は、指定されたポート番号とプロトコルに対応するサービス名を取得する際に利用されます。これは、TCP/IPネットワークにおいて、どのサービスが特定のポートを使用しているかを知るための基本的な機能です。C言語のシステムプログラミングにも同名の関数があり、ネットワークの基礎を学ぶ上で共通の概念として登場します。
この関数は二つの引数を取ります。一つ目の$portは、サービス名を調べたいポート番号を整数で指定します。二つ目の$protocolは、そのポートが使用するプロトコルを「tcp」や「udp」といった文字列で指定します。
処理の結果として、対応するサービス名が見つかった場合はそのサービス名(文字列)を返します。サービス名が見つからない場合や、指定されたプロトコルが無効な場合はfalseを返します。そのため、関数がfalseを返した場合に備えてエラー処理を行うことが重要です。
サンプルコードでは、displayServiceByPort関数を使って、ウェブ(HTTP)やファイル転送(FTP)などの一般的なTCPサービス、DNSなどのUDPサービスについて、ポート番号からサービス名を検索し表示する例を示しています。この関数を通じて、ネットワーク上のサービスがどのようにポートとプロトコルに関連付けられているかを理解する手助けとなります。
getservbyport関数は、指定したポート番号とプロトコルに対応するサービス名を返しますが、サービス名が見つからない場合は必ずfalseが返るため、戻り値を厳密にチェックする習慣をつけましょう。引数のプロトコルは'tcp'または'udp'の文字列で正確に指定する必要があります。この関数は、C言語のシステムプログラミングにもあるように、OSが管理するサービス定義ファイル(例:Linuxの/etc/services)から情報を取得しています。そのため、システムによっては情報が存在しない場合や内容が異なる可能性があります。また、これはあくまで登録されたサービス名を取得するだけであり、実際にそのポートでサービスが稼働しているかを確認する機能ではないことにご注意ください。