begin process at 2008 07 20 15:52:28
1 213 292 membres
207 nouveaux aujourd'hui
14 166 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Socket connectée [ Archives / Au secours ] (immerczeck)

Socket connectée le 08/02/2006 20:57:23

immerczeck
Bonjour!
Pourriez-vous m'indiquer une manière de vérifier qu'une socket est toujours active, que le client à l'autre bout n'a pas fermé l'application?
J'ai essayé la méthode avec Poll et Available==0 mais ça ne donne rien, et j'ai lu que la propriété Connected ne s'actualisait pas au cours du temps, alors pourriez-vous me donner une méthode fiable?

Merci d'avance

Immerczeck

Re : Socket connectée le 08/02/2006 21:34:45

MorpionMx
Membre Club
(Admin CS)
Salut,

Pourtant c'est une bonne technique (la bonne technique ? )
Qu'entends-tu par "ca ne donne rien" ?

Une autre technique, dans le cadre d'un client qui se deconnecte "proprement" (pas de plantage), serait que le client envoie un message au serveur pour le prevenir qu'il se deconnecte.

Sinon, je ne connais pas d'autre méthode que celle du Poll.


Mx
MVP C#
 


Re : Socket connectée le 08/02/2006 21:57:55

immerczeck
ben ça ne donne rien dans le sens où ça ne réagit pas lorsque le client se déconnecte. Voici un bout du code :

while(true)
            { [...]
                foreach (idclient client in ArrayList.Synchronized(clients))
                {
                     if(client.sock.Poll(10, SelectMode.SelectRead) && client.sock.Available==0)
                        {
                            richTextBox1.Text+= "Le client "+ client.nick+" s'est déconnecté\r";
                            listBox1.Items.Remove(client.nick);
                            ArrayList.Synchronized(clients).Remove(client);
                        }[...]
                }
          }

Pitetre me suis-je trompé quelque part...
Sinon j'avais pensé à la solution du message envoyé par le client à déconnexion, mais comme tu l'as dit, dans le cas d'un plantage... c'est plutôt gênant de garder une socket déconnectée...



Re : Socket connectée le 08/02/2006 22:22:37

MorpionMx
Membre Club
(Admin CS)
Ca m'a pourtant bien l'air d'etre ca...
Essayons de diagnostiquer...
Est-ce que le thread dans lequel se trouve ta boucle tourne bien ? As tu essayé de debugger en pas a pas, pour voir les valeurs qu'il pouvait te donner ? (genre ton arraylist vide)
Es-tu sur que le client avec lequel tu testes est bien deconnecté (ca peut paraitre bete comme question, mais bon, parfois on pense qu'on a fermé le client, mais le process tourne encore en fond parce qu'un thread n'a pas sa propriété IsBackground a true)


Mx
MVP C#
 


Re : Socket connectée le 08/02/2006 22:36:33

immerczeck
Oui, le client est bien déconnecté, je n'ai pas mis ISBackground à true, c'est trop brutal, j'ai arrangé l'évènement Closing de la form. Je teste en réseau local, j'ai donc tous les moyens de vérifier. Le thread tourne bien, puisque c'est le même qui s'occupe de la gestion des messages (là peut-être que ça vient de là, j'aurais peut-être dû les séparer).
L'arrayList n'est pas vide puis que j'ai en permanence une listbox qui m'affiche tous les client.nick.

Immerczeck

Re : Socket connectée le 09/02/2006 10:36:02

MorpionMx
Membre Club
(Admin CS)
Réponse acceptée !
Bonjour,
Je suis très embété parce que je viens de faire un rapide essai, et ca marche.

Le code dans mon thread :


lock(this.clientsList.SyncRoot)
{
   foreach (Client client in this.clientsList)
   {
      if (client.Socket.Poll(10, SelectMode.SelectRead) && client.Socket.Available == 0)
         Console.WriteLine(string.Format("client {0} deconnecté", client.IDClient));
   }
}


Par contre c'est sur que je mettrais pas ce code dans le thread qui gere les message, mais dans un thread dedié a la detection de deconnexion sauvage..
Et dans ce thread, je ne ferais pas de boucle active ( while(true) ), mais je le déclencherais plutot via un timer, toutes les X secondes.

Mx
MVP C#
 


Re : Socket connectée le 09/02/2006 10:53:45

coq
(Admin CS)
Réponse acceptée !
Ou en mettant une pause, ainsi que la gestion de ThreadAbortException.

Sinon tu peux aussi prévoir dans ton protocole un timeout au bout duquel tu considères que ton client est parti si tu n'as pas reçu de données.
Ou définir un message auquel le client doit répondre pour signaler qu'il est toujours là. :-)



/*
coq
MVP Visual C#
*/

Re : Socket connectée le 09/02/2006 11:02:00

MorpionMx
Membre Club
(Admin CS)
J'aurais aussi fait ca, (et d'ailleurs, j'ai toujours fait ca jusque maintenant). Mais j'ai recemment entendu d'un prof que c'etait pas terrible de faire une boucle dans un Thread avec une pause dedans, alors j'ai voulu donner une autre possibilité, en me disant qu'elle etait peut-etre meilleure que la mienne.
Maintenant, si tu ferais comme ca aussi coq, c'est que ca doit pas etre une si mauvaise solution que ca


Mx
MVP C#
 


Re : Socket connectée le 09/02/2006 11:07:20

coq
(Admin CS)
Je ne suis pas très pointu en threading, mais c'est juste que l'utilisation d'un timer pour lancer le thread à intervalle réguliers me paraissait un peu bizarre.
Je vais essayer de trouver des infos sur la question.



/*
coq
MVP Visual C#
*/

Re : Socket connectée le 09/02/2006 11:19:52

MorpionMx
Membre Club
(Admin CS)
Réponse acceptée !
L'idée du Timer en plus clair :





System.Threading.Timer timer = new System.Threading.Timer(new TimerCallback(ListenForDeconnection), null, 0, 10000);
[...]

private void ListenForDeconnection(object state)
{
      foreach (idclient client in ArrayList.Synchronized(clients))
      {
          if(client.sock.Poll(10, SelectMode.SelectRead) && client.sock.Available==0)
          {
            ....
           
}
      }
}




Mx
MVP C#
 



[Page 1 Page 2]
Classé sous : socket, méthode, connectée

Participer à cet échange

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

Snippets en rapport

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS