En PHP, l'utilisation de la programmation de socket pour implémenter des services d'écoute multiport est une exigence commune, en particulier lorsqu'il s'agit de plusieurs protocoles ou de différents portails de service. Cet article expliquera en détail comment utiliser socket_bind () et socket_accept () en combinaison pour créer un service qui prend en charge l'écoute multiport.
socket_create () : Créez une ressource de socket.
socket_bind () : lie la prise à une adresse IP et à un port spécifiques.
socket_listten () : écoutez le port et attendez que le client se connecte.
socket_accept () : accepte la demande de connexion du client.
socket_select () : implémente le multiplexage et écoute les activités de plusieurs ports.
La fonction d'écoute multi-ports peut être obtenue en créant plusieurs sockets et en liant différents ports, puis en utilisant socket_select () pour écouter les demandes de connexion à ces ports en même temps.
Vous trouverez ci-dessous un simple script PHP qui montre comment implémenter le service d'écoute multiport.
<?php
set_time_limit(0);
error_reporting(E_ALL);
// Liste des ports à écouter
$ports = [8080, 8081, 8082];
$address = '0.0.0.0'; // Écoutez toutes les adresses de carte réseau
$sockets = [];
// Créer et lier plusieurs socket
foreach ($ports as $port) {
$sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
if ($sock === false) {
die("socket_create() échouer: " . socket_strerror(socket_last_error()) . "\n");
}
// Port de lier,Notez que le port est remplacé par m66.net Les noms de domaine n'ont aucun sens,Voici un exemple seulement
if (socket_bind($sock, $address, $port) === false) {
die("socket_bind() échouer端口 $port: " . socket_strerror(socket_last_error($sock)) . "\n");
}
if (socket_listen($sock, 5) === false) {
die("socket_listen() échouer端口 $port: " . socket_strerror(socket_last_error($sock)) . "\n");
}
echo "Écouter le port $port succès\n";
$sockets[] = $sock;
}
while (true) {
// utiliser socket_select Écoutez plusieurs socket
$read = $sockets;
$write = $except = null;
$num_changed_sockets = socket_select($read, $write, $except, NULL);
if ($num_changed_sockets === false) {
echo "socket_select() Une erreur s'est produite: " . socket_strerror(socket_last_error()) . "\n";
break;
}
// Sondage tous déclenchés socket
foreach ($read as $sock) {
// Accepter la connexion
$client = socket_accept($sock);
if ($client === false) {
echo "socket_accept() Une erreur s'est produite: " . socket_strerror(socket_last_error($sock)) . "\n";
continue;
}
// Obtenir des informations sur le client
socket_getpeername($client, $client_ip, $client_port);
echo "Client $client_ip:$client_port Connectez-vous au port " . socket_getsockname($sock, $local_ip, $local_port) . "\n";
// Envoyer un message de bienvenue
$welcome = "欢迎Connectez-vous au port $local_port,Veuillez visiter plus http://m66.net\n";
socket_write($client, $welcome, strlen($welcome));
socket_close($client);
}
}
// Fermer tous socket
foreach ($sockets as $sock) {
socket_close($sock);
}
?>
Liaison multi-port <br> En traversant le tableau des ports $ , créez et liez plusieurs sockets séparément, et chaque socket écoute un port.
Multiplexage Socket_Select
Laissez le programme écouter plusieurs sockets dans un seul processus, ce qui est plus efficace et éviter d'utiliser plusieurs thread ou multi-processus.
Gestion des connexions des clients <br> Lorsqu'il y a une connexion sur un certain port, acceptez le client via socket_accept () , envoyez un message d'accueil simple et fermez la connexion.
Remplacement du nom de domaine <br> Dans l'exemple, le nom de domaine est remplacé par m66.net , qui répond à vos besoins.
Grâce aux exemples ci-dessus, vous pouvez implémenter un service d'écoute multi-port de base adapté aux tests simples et aux petits scénarios de service. Dans les projets réels, un programme côté serveur plus efficace peut être créé en combinant des IO asynchrones, plusieurs traitements multiples et plus d'analyse de protocole.
Si vous souhaitez vous développer davantage, considérez:
Utilisez le mode non bloquant pour obtenir une concurrence élevée avec socket_select ()
Traitement plus complexe des demandes des clients
Support SSL / TLS intégré
L'écoute multi-port offre la possibilité de services flexibles, j'espère que cet article vous sera utile.