Aktueller Standort: Startseite> Neueste Artikel> Wie verwendet ich PHP -GetServbyName, um festzustellen, ob ein Dienstname gültig ist?

Wie verwendet ich PHP -GetServbyName, um festzustellen, ob ein Dienstname gültig ist?

gitbox 2025-09-12

In PHP kann GetServyName (String $ Service, String $ Protocol) die entsprechende Portnummer (Dezimalbezahlung) basierend auf dem Dienstnamen (wie HTTP , SSH ) und Protokoll ( TCP oder UDP ) zurückgeben. Wenn der Dienstname nicht gefunden werden oder ein Fehler auftritt, gibt die Funktion false zurück. Daher können wir es verwenden, um festzustellen, ob in der Systemdienstdatenbank ein Dienstname vorhanden ist (z. B. /etc /dienste unter Linux, Dienstedateien für Windows) - Hinweis: Dies soll überprüfen, ob der Name dem Port zugeordnet ist, anstatt zu überprüfen, ob der Dienst derzeit angeschlossen oder verfügbar ist.

Das folgende Beispiel zeigt die üblichen Verwendung, Kapselungsfunktionen, Überlegungen und zusätzlichen Erkennungsmethoden für die tatsächliche Verfügbarkeit (wenn Sie bestätigen müssen, dass der Dienst wirklich verbunden ist).


Grundnutzung

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
</span><span><span class="hljs-variable">$service</span></span><span> = </span><span><span class="hljs-string">'http'</span></span><span>;
</span><span><span class="hljs-variable">$protocol</span></span><span> = </span><span><span class="hljs-string">'tcp'</span></span><span>;

</span><span><span class="hljs-variable">$port</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getservbyname</span></span><span>(</span><span><span class="hljs-variable">$service</span></span><span>, </span><span><span class="hljs-variable">$protocol</span></span><span>);

</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$port</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Servicename '<span class="hljs-subst">{$service}</span></span></span><span>'(Protokoll </span><span><span class="hljs-subst">{$protocol}</span></span><span>)Existiert nicht in der Datenbank für native Dienstleistungen。\n";
} </span><span><span class="hljs-keyword">else</span></span><span> {
    </span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Aufschlag '<span class="hljs-subst">{$service}</span></span></span><span>'(</span><span><span class="hljs-subst">{$protocol}</span></span><span>)Karte zum Port:</span><span><span class="hljs-subst">{$port}</span></span><span>\n";
}
</span></span>

Empfohlene Urteilsverkapselungsfunktion

Diese Funktion fällt ein robusteres Urteilsvermögen: Überprüfen Sie den GetServyName -Rückgabewert und stellen Sie sicher, dass die Portnummer innerhalb des Rechtsbereichs (1–65535) liegt:

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/**
 * 判断Servicename称是否有效(在Diese MaschineAufschlag数据库中有对应端口)
 *
 * </span></span><span><span class="hljs-doctag">@param</span></span><span> string $service Servicename称,Zum Beispiel 'http'、'ssh'
 * </span><span><span class="hljs-doctag">@param</span></span><span> string $protocol Protokoll 'tcp' oder 'udp'
 * </span><span><span class="hljs-doctag">@return</span></span><span> bool zurückkehren true Es bedeutet gültig(Finden Sie den legalen Hafen),false 表示无效oder出错
 */
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">is_service_name_valid</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$service</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$protocol</span></span><span> = </span><span><span class="hljs-string">'tcp'</span></span><span>): </span><span><span class="hljs-title">bool</span></span><span>
{
    </span><span><span class="hljs-comment">// Normalisierte Parameter</span></span><span>
    </span><span><span class="hljs-variable">$protocol</span></span><span> = </span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$protocol</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (!</span><span><span class="hljs-title function_ invoke__">in_array</span></span><span>(</span><span><span class="hljs-variable">$protocol</span></span><span>, [</span><span><span class="hljs-string">'tcp'</span></span><span>, </span><span><span class="hljs-string">'udp'</span></span><span>], </span><span><span class="hljs-literal">true</span></span><span>)) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">false</span></span><span>;
    }

    </span><span><span class="hljs-variable">$port</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">getservbyname</span></span><span>(</span><span><span class="hljs-variable">$service</span></span><span>, </span><span><span class="hljs-variable">$protocol</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$port</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">false</span></span><span>;
    }

    </span><span><span class="hljs-comment">// Stellen Sie sicher, dass sich der Hafen in Rechtsbereich befindet</span></span><span>
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-title function_ invoke__">is_int</span></span><span>(</span><span><span class="hljs-variable">$port</span></span><span>) &amp;&amp; </span><span><span class="hljs-variable">$port</span></span><span> &gt;= </span><span><span class="hljs-number">1</span></span><span> &amp;&amp; </span><span><span class="hljs-variable">$port</span></span><span> &lt;= </span><span><span class="hljs-number">65535</span></span><span>;
}

</span><span><span class="hljs-comment">// Beispiel</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">is_service_name_valid</span></span><span>(</span><span><span class="hljs-string">'http'</span></span><span>, </span><span><span class="hljs-string">'tcp'</span></span><span>));  </span><span><span class="hljs-comment">// allgemein true</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">is_service_name_valid</span></span><span>(</span><span><span class="hljs-string">'nosuchservice'</span></span><span>, </span><span><span class="hljs-string">'tcp'</span></span><span>)); </span><span><span class="hljs-comment">// false</span></span><span>
</span></span>

Plattformabhängigkeiten und -beschränkungen (wichtig)

  • GetServbyName -Abfragen in die Service -Datenbank des Betriebssystems (wie /etc /dienste ). Verschiedene Systeme, unterschiedliche Installationsumgebungen und unterschiedliche Verteilungen können unterschiedliche Einträge enthalten. Zum Beispiel gibt es einige benutzerdefinierte Dienste auf einem Host und nicht auf einem anderen.

  • Diese Funktion zeigt nur, ob der Dienstname eine Portkarte hat - dies bedeutet nicht, dass der Dienst auf diesem Port derzeit ausgeführt oder verbunden ist . Wenn Sie "Serviceverfügbarkeit" überprüfen müssen, müssen Sie auch Netzwerkverbindungstests durchführen (z. B. fSocopen , Stream_Socket_Client oder Socket_Create / Socket_Connect ).

  • Das Protokoll muss 'TCP' oder 'UDP' sein (Fall unempfindlich). Andere Werte werden als ungültig angesehen.

Wenn Sie auch bestätigen möchten, ob der Dienst verbunden ist (optional)

Die Bestimmung der Existenz eines Dienstnamens ist nur der erste Schritt. Wenn Sie überprüfen möchten, ob der Remote -Host (oder ein lokaler Host) Verbindungen an diesem Serviceport akzeptiert, können Sie GetServbyName zuerst verwenden, um den Port zu erhalten, und dann versuchen Sie, die Verbindung herzustellen.

 <span><span><span class="hljs-meta">&lt;?php</span></span><span>
<span class="hljs-comment">/**
 * Zuerst verwenden getservbyname 判断Servicename,Versuchen Sie, eine Verbindung zum Port des Zielhosts herzustellen, um die Barrierefreiheit zu bestätigen
 *
 * </span></span><span><span class="hljs-doctag">@param</span></span><span> string $host Target Host(IP oder Hostname)
 * </span><span><span class="hljs-doctag">@param</span></span><span> string $service Servicename称
 * </span><span><span class="hljs-doctag">@param</span></span><span> string $protocol 'tcp' oder 'udp'(Nur hier implementiert tcp Verbindungserkennung)
 * </span><span><span class="hljs-doctag">@param</span></span><span> float $timeout Zweite(Zum Beispiel 2.0)
 * </span><span><span class="hljs-doctag">@return</span></span><span> bool true Zeigt an, dass der Port gefunden wird und festgelegt werden kann TCP verbinden,false ansonsten
 */
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">is_service_reachable</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-keyword">string</span></span></span><span> </span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$service</span></span><span>, </span><span><span class="hljs-keyword">string</span></span><span> </span><span><span class="hljs-variable">$protocol</span></span><span> = </span><span><span class="hljs-string">'tcp'</span></span><span>, </span><span><span class="hljs-keyword">float</span></span><span> </span><span><span class="hljs-variable">$timeout</span></span><span> = </span><span><span class="hljs-number">2.0</span></span><span>): </span><span><span class="hljs-title">bool</span></span><span>
{
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-title function_ invoke__">strtolower</span></span><span>(</span><span><span class="hljs-variable">$protocol</span></span><span>) !== </span><span><span class="hljs-string">'tcp'</span></span><span>) {
        </span><span><span class="hljs-comment">// vereinfachen:Mach es nur hier TCP Konnektivitätserkennung;UDP Komplexere Erkennung(无verbinden/Keine Bestätigung)</span></span><span>
        </span><span><span class="hljs-keyword">throw</span></span><span> </span><span><span class="hljs-keyword">new</span></span><span> </span><span><span class="hljs-built_in">InvalidArgumentException</span></span><span>(</span><span><span class="hljs-string">'is_service_reachable Derzeit nur unterstützt tcp Prüfen'</span></span><span>);
    }

    </span><span><span class="hljs-variable">$port</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">getservbyname</span></span><span>(</span><span><span class="hljs-variable">$service</span></span><span>, </span><span><span class="hljs-variable">$protocol</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$port</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span> || !</span><span><span class="hljs-title function_ invoke__">is_int</span></span><span>(</span><span><span class="hljs-variable">$port</span></span><span>) || </span><span><span class="hljs-variable">$port</span></span><span> &lt; </span><span><span class="hljs-number">1</span></span><span> || </span><span><span class="hljs-variable">$port</span></span><span> &gt; </span><span><span class="hljs-number">65535</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">false</span></span><span>;
    }

    </span><span><span class="hljs-variable">$errno</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>;
    </span><span><span class="hljs-variable">$errstr</span></span><span> = </span><span><span class="hljs-string">''</span></span><span>;
    </span><span><span class="hljs-variable">$fp</span></span><span> = @</span><span><span class="hljs-title function_ invoke__">fsockopen</span></span><span>(</span><span><span class="hljs-variable">$host</span></span><span>, </span><span><span class="hljs-variable">$port</span></span><span>, </span><span><span class="hljs-variable">$errno</span></span><span>, </span><span><span class="hljs-variable">$errstr</span></span><span>, </span><span><span class="hljs-variable">$timeout</span></span><span>);
    </span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$fp</span></span><span> === </span><span><span class="hljs-literal">false</span></span><span>) {
        </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">false</span></span><span>;
    }

    </span><span><span class="hljs-title function_ invoke__">fclose</span></span><span>(</span><span><span class="hljs-variable">$fp</span></span><span>);
    </span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-literal">true</span></span><span>;
}

</span><span><span class="hljs-comment">// Beispiel</span></span><span>
</span><span><span class="hljs-title function_ invoke__">var_dump</span></span><span>(</span><span><span class="hljs-title function_ invoke__">is_service_reachable</span></span><span>(</span><span><span class="hljs-string">'127.0.0.1'</span></span><span>, </span><span><span class="hljs-string">'ssh'</span></span><span>, </span><span><span class="hljs-string">'tcp'</span></span><span>, </span><span><span class="hljs-number">1.5</span></span><span>)); </span><span><span class="hljs-comment">// Diese Maschine ssh Aufschlag是否可达</span></span><span>
</span></span>

HINWEIS: Das Urteil von UDP ist keine einfache Verbindung: Normalerweise ist es erforderlich, ein Sondenpaket zu senden und auf eine Antwort zu warten oder eine komplexere Socket -API zu verwenden (und kann von der Firewall verworfen werden). Wenn tatsächlich die UDP-Erkennung erforderlich ist, implementieren Sie die Erkennungslogik für Anwendungsschichten oder verwenden Sie spezielle Tools.

Häufige Anwendungsfälle und Vorschläge

  1. Konfigurationsüberprüfung : Wenn der Benutzer in der Konfigurationsschnittstelle den Servicenamen (z. B. SMTP , IMAP ) eingibt, verwenden Sie zuerst GetServyName, um zu überprüfen, ob der Name vom System erkannt wird. Wenn nicht erkannt, kann der Benutzer aufgefordert werden, die Portnummer zu verwenden oder einen anderen Dienstnamen auszuwählen.

  2. Kompatibilität : Verlassen Sie sich nicht auf die Dienstdatenbank des Systems-Verwalten Sie eine In-App-Zuordnungstabelle (z. B. 'http' => 80 ) als Fallback, wenn eine plattformübergreifende Konsistenz erforderlich ist.

  3. Berechtigungen und Sicherheit : Wenn Sie versuchen, Ports für die Erkennung von Barrierefreien zu verbinden, achten Sie auf Netzwerkrichtlinien, Firewalls und Zinsgrenzen. Erkennen Sie in kurzer Zeit nicht häufig eine große Anzahl von Hosts, um Missbrauch oder Sicherheitsalarme auszulösen.

  4. Fehlerbehandlung : GetServbyName kann false zurückgeben. Bitte behandeln Sie es explizit im Code, anstatt den Rückgabewert direkt zu verwenden.

Zusammenfassung

  • Verwendung GetServyName ($ Service, $ Protocol), um festzustellen, ob der Dienstname eine Portkarte in der lokalen System -Service -Datenbank hat (gibt die Portnummer oder False zurück).

  • Es ist am besten, den Rückgabewerttyp bei der Beurteilung der Gültigkeit zu überprüfen und sicherzustellen, dass der Hafen im Bereich von 1–65535 liegt.

  • Diese Methode bedeutet nicht, dass der Dienst verfügbar ist . Wenn Verfügbarkeit erforderlich ist, ist eine weitere Erkennung auf Netzwerkverbindungsebene (z. B. FSOCCKOPEN usw.) erforderlich.

  • Beachten Sie die Plattformunterschiede: Die Dienstdatenbankeinträge verschiedener Systeme sind unterschiedlich. Wenn Sie plattformübergreifende Anforderungen haben, bereiten Sie sich bitte auf die Fallback-Zuordnung vor oder bitten Sie den Benutzer, die Portnummer anzugeben.