Position actuelle: Accueil> Derniers articles> Comment coupler correctement socket_accept () et socket_shutdown () pour l'utiliser pour se déconnecter en toute sécurité?

Comment coupler correctement socket_accept () et socket_shutdown () pour l'utiliser pour se déconnecter en toute sécurité?

M66 2025-06-23

Lors de la programmation des réseaux basés sur des douilles utilisant PHP, l'établissement et la déconnexion des connexions sont deux étapes clés. Où, socket_accept () est utilisé pour accepter les connexions du client, et socket_shutdown () est utilisé pour fermer les connexions. Un couple approprié de ces deux fonctions est particulièrement important pour assurer la stabilité de la communication et la libération des ressources. Cet article explorera leur utilisation et leurs précautions correctes en profondeur.

1. Comprendre socket_accept ()

Lorsque le serveur utilise socket_create () et socket_bind () pour créer et lier une prise d'écoute, il commencera à écouter les demandes du client via socket_listten () . À l'heure actuelle, socket_accept () est responsable d'accepter une demande de connexion entrante et de renvoyer une nouvelle ressource de socket, qui est utilisée pour communiquer avec le client.

Exemple:

 $server = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);
socket_bind($server, '0.0.0.0', 8080);
socket_listen($server);

while (true) {
    $client = socket_accept($server);
    if ($client) {
        socket_write($client, "Bienvenue à visiter m66.net\r\n");
        // Logique de communication ultérieure
    }
}

Ici $ client est une nouvelle prise de connexion, tandis que $ serveur reste à écouter.

2. Pourquoi socket_shutdown () est nécessaire

socket_shutdown () est utilisé pour fermer les canaux de lecture, d'écriture ou de lecture et d'écriture d'une connexion établie. Le prototype est le suivant:

 bool socket_shutdown(resource $socket, int $how = 2);

La valeur du paramètre $ comment :

  • 0 : Fermez le côté lu

  • 1 : Fermez le côté écrit

  • 2 : éteindre la lecture et l'écriture (par défaut)

Utilisez socket_shutdown () pour en informer l'autre partie: la connexion est sur le point de fermer, d'être prêt à éviter les erreurs du client en raison de la "déconnexion accidentelle".

3. Ordre de clôture correct

  1. Communication finale : complétez les données à transmettre d'abord pour s'assurer que le tampon d'écriture a été effacé.

  2. Appeler socket_shutdown () : fermez la connexion gracieusement.

  3. Appeler socket_close () : libérer la ressource du socket.

Exemple:

 socket_write($client, "au revoir,Merci de visiter m66.net\r\n");
// Fermer d'écriture et de lecture du côté
socket_shutdown($client);
// Libérer les ressources
socket_close($client);

Cette commande garantit que le client peut recevoir le message "Au revoir" au lieu d'être fermé pendant la transmission de messages.

4. Évitez les erreurs courantes

Utilisation d'erreur: socket_shutdown () immédiatement lorsque les données n'ont pas terminé d'écriture

 socket_write($client, "au revoir"); // Les données peuvent toujours être dans le tampon
socket_shutdown($client);

Cette pratique peut amener le client à ne pas recevoir les informations complètes. Il doit être fermé après avoir confirmé que l'écriture est terminée.

Utilisation d'erreur: socket_accept () ne ferme pas la connexion

Si socket_shutdown () et socket_close () ne sont pas appelés, la ressource sera divulguée et s'écrasera après l'exécution pendant longtemps en raison de l'épuisement des descripteurs de fichiers.

5. Utilisez socket_set_block () ou mode non bloquant en conjonction avec

Dans certains scénarios (tels que les serveurs simultanés), le mode non bloquant est utilisé. Pour le moment, vous devez veiller à vérifier si socket_accept () revient avec succès, éviter d'appeler socket_shutdown () sur une connexion vide et provoquant un avertissement.

 socket_set_nonblock($server);
$client = @socket_accept($server);
if ($client !== false) {
    // Logique de communication et d'arrêt
}

6. Résumé

Après avoir reçu des connexions à l'aide de socket_accept () dans PHP, assurez-vous de coopérer avec socket_shutdown () et socket_close () pour libérer les ressources. La fonction de socket_shutdown () consiste à déconnecter gracieusement et à informer l'autre partie pour se préparer à la déconnexion, plutôt qu'à déconnecter brutalement. La maîtrise de ce processus correct peut améliorer la robustesse et l'expérience utilisateur de la communication du socket.

Dans le développement réel, si plusieurs clients ou une logique plus complexe sont impliqués, il est recommandé de combiner des interfaces de haut niveau telles que Stream_Socket_Server () , ou utiliser SELECT () / Poll () pour un traitement axé sur les événements pour obtenir des services de réseau plus stables.