Surveillance des déconnexions des clients de socket côté serveur
Dans les applications distribuées, la détection rapide de la déconnexion du client est essentielle au maintien de l'intégrité du système. Cependant, contrairement au client qui peut notifier le serveur à l'aide d'événements ou de rappels, le serveur est confronté au défi d'identifier de manière proactive la terminaison du client.
Méthode de détection
Les méthodes suivantes se sont révélées inefficaces pour détecter les déconnexions des clients sur les sockets du serveur :
handler.Available
: Cette méthode renvoie le nombre d'octets pouvant être lus, mais ce n'est pas une indication de déconnexion. handler.Send
: Si le client s'est déconnecté, l'envoi des données échouera, mais il s'agit d'un test destructif et provoquera une erreur lors de la tentative de reconnexion. handler.Receive
: De même, si le client n'est pas connecté, tenter de recevoir des données entraînera une exception. Interrogation à l'aide de méthodes d'extension
Comme il n'y a pas d'événement dédié à la déconnexion du socket, une interrogation périodique est recommandée. Pour simplifier ce processus, vous pouvez créer une méthode d'extension :
<code class="language-csharp">static class SocketExtensions { public static bool IsConnected(this Socket socket) { try { return !(socket.Poll(1, SelectMode.SelectRead) && socket.Available == 0); } catch (SocketException) { return false; } } }</code>
Cette méthode utilise la méthode Poll
pour vérifier la disponibilité des données. Si le sondage réussit mais que Available
renvoie 0, cela indique que la connexion a peut-être été déconnectée, ce qui peut être confirmé en capturant SocketException
lors de l'opération d'envoi.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!