Sockets C # Comment gérer les déconnexions non planifiées sur les serveurs de sockets?

Je construis un serveur de sockets en C # et j’ai un problème avec les déconnexions de sockets non planifiées. Pour l’instant, je me débrouille comme ça:

private List _acceptedClientsList = new List(); public void checkIfStillConnected() { while (true) { lock (_sync) { for (int i = 0; i < _acceptedClientsList.Count(); ++i) { if (_acceptedClientsList[i].Client.Client.Poll(10, SelectMode.SelectRead) == true && (_acceptedClientsList[i]).Client.Client.Available == 0) // 5000 is the time to wait for a response, in microseconds. { NHDatabaseHandler dbHandler = new NHDatabaseHandler(); dbHandler.Init(); if (_acceptedClientsList[i].isVoipClient == true) { dbHandler.UpdateUserStatus(_acceptedClientsList[i].UserName, EStatus.Offline); } RemoveClient(i); // this function removes the selected client at i from the acceptedClientsList i--; } } } } } 

Mais ce n’est pas optimisé du tout. Ceci est un thread qui vérifie chaque état des sockets avec le socket.poll, à chaque fois, à l’infini …

Je ne sais pas si c’est la meilleure chose à faire … On dirait que c’est lourd et bizarre. Est-ce que quelqu’un a une idée?

Merci

Il est préférable d’avoir un thread dédié pour lire les données entrantes de chaque socket. Si une déconnexion de socket non planifiée se produit (par exemple, si le réseau côté client se désactive ou se bloque), le socket lancera une exception. Vous pouvez alors intercepter une exception, puis fermer la connexion de socket et terminer le thread proprement tout en maintenant les autres socket en cours d’exécution.

J’ai appris la communication TCP / IP à partir de ce tutoriel.

http://www.codeproject.com/Articles/155282/TCP-Server-Client-Communication-Implementation

L’auteur explique très bien son implémentation. Cela vaut la peine d’apprendre. Vous pouvez le référencer pour réécrire votre propre bibliothèque.