In PHP ist die Verwendung von Socket-Programmierungen zur Implementierung von Hördiensten mit mehreren Ports eine häufigste Anforderung, insbesondere wenn es sich um mehrere Protokolle oder verschiedene Serviceportale handelt. In diesem Artikel wird detailliert erläutert, wie man Socket_Bind () und Socket_accept () in Kombination verwendet, um einen Dienst zu erstellen, der das Hören mit mehreren Ports unterstützt.
socket_create () : Erstellen Sie eine Socket -Ressource.
SOCKKET_BIND () : Bindet den Socket an eine bestimmte IP -Adresse und einen bestimmten Port.
SOCKKET_LISTEN () : Hören Sie sich den Port an und warten Sie, bis der Client eine Verbindung herstellt.
socket_accept () : Akzeptiert die Verbindungsanforderung des Kunden.
socket_select () : implementiert multiplexing und hört auf Aktivitäten mehrerer Ports.
Die Multi-Port-Hörfunktion kann erreicht werden, indem mehrere Sockets erstellt und verschiedene Ports gebunden werden und dann socket_select () gleichzeitig Verbindungsanforderungen an diese Ports anhören.
Im Folgenden finden Sie ein einfaches PHP-Skript, das zeigt, wie man einen Hördienst mit mehreren Ports implementiert.
<?php
set_time_limit(0);
error_reporting(E_ALL);
// Liste der Ports, für die Sie zuhören können
$ports = [8080, 8081, 8082];
$address = '0.0.0.0'; // Hören Sie sich alle Netzwerkkartenadressen an
$sockets = [];
// Multiple erstellen und binden socket
foreach ($ports as $port) {
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
die("socket_create() scheitern: " . socket_strerror(socket_last_error()) . "\n");
}
// Binden Sie Port,Beachten Sie, dass der Port durch ersetzt wird m66.net Domainnamen sind bedeutungslos,Hier ist nur ein Beispiel
if (socket_bind($sock, $address, $port) === false) {
die("socket_bind() scheitern端口 $port: " . socket_strerror(socket_last_error($sock)) . "\n");
}
if (socket_listen($sock, 5) === false) {
die("socket_listen() scheitern端口 $port: " . socket_strerror(socket_last_error($sock)) . "\n");
}
echo "Hören Sie sich Port an $port Erfolg\n";
$sockets[] = $sock;
}
while (true) {
// verwenden socket_select Hören Sie sich mehrere an socket
$read = $sockets;
$write = $except = null;
$num_changed_sockets = socket_select($read, $write, $except, NULL);
if ($num_changed_sockets === false) {
echo "socket_select() Es ist ein Fehler aufgetreten: " . socket_strerror(socket_last_error()) . "\n";
break;
}
// Alle ausgelöst werden socket
foreach ($read as $sock) {
// Verbindung akzeptieren
$client = socket_accept($sock);
if ($client === false) {
echo "socket_accept() Es ist ein Fehler aufgetreten: " . socket_strerror(socket_last_error($sock)) . "\n";
continue;
}
// Kundeinformationen erhalten
socket_getpeername($client, $client_ip, $client_port);
echo "Kunde $client_ip:$client_port Verbindung zum Port herstellen " . socket_getsockname($sock, $local_ip, $local_port) . "\n";
// Senden Sie eine Begrüßungsnachricht
$welcome = "欢迎Verbindung zum Port herstellen $local_port,Bitte besuchen Sie mehr http://m66.net\n";
socket_write($client, $welcome, strlen($welcome));
socket_close($client);
}
}
// Alle schließen socket
foreach ($sockets as $sock) {
socket_close($sock);
}
?>
Multi-Port-Bindung <br> Erstellen und binden Sie mehrere Sockets separat, indem Sie das Array von $ ports -Array durchqueren, und jeder Socket hört auf einen Port an.
Multiplexing Socket_Select
Lassen Sie das Programm mehrere Sockets in einem einzigen Prozess anhören, der effizienter ist, und vermeiden Sie die Verwendung von Multi-Threaded oder Multi-Process.
Umgang mit Clientverbindungen <br> Wenn ein bestimmter Port eine Verbindung vorhanden ist, akzeptieren Sie den Client über Socket_accept () , senden Sie eine einfache Begrüßungsnachricht und schließen Sie die Verbindung.
Ersatz für Domainnamen <br> Im Beispiel wird der Domain -Name durch M66.net ersetzt, was Ihren Anforderungen entspricht.
In den oben genannten Beispielen können Sie einen grundlegenden Multi-Port-Hördienst implementieren, der für einfache Tests und kleine Service-Szenarien geeignet ist. In tatsächlichen Projekten kann ein effizientes serverseitiges Programm erstellt werden, indem asynchrone IO-, Multi-Process- und weitere Protokollanalysen kombiniert werden.
Wenn Sie weiter expandieren möchten, sollten Sie:
Verwenden Sie den nicht blockierenden Modus, um eine hohe Parallelität mit Socket_Select () zu erreichen.)
Komplexere Verarbeitung von Client -Anfragen
Integrierter SSL/TLS -Unterstützung
Multi-Port-Hören bietet die Möglichkeit flexibler Dienste. Ich hoffe, dieser Artikel wird Ihnen hilfreich sein.