IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

Socket : méthode Close()


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 113
    Points : 45
    Points
    45
    Par défaut Socket : méthode Close()
    Salut, je développe actuellement un petit logiciel de messagerie instantanée, j'arrive à peu près bien gérer le client. Mais un problème subsiste et j'aurai besoin de vos lumières.

    voici un extrait de ma classe Fenetre permettant d'envoyer des messages et incorporant un thread d'écoute!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    public void ecoute(Object sock)
            {
                while (true)
                {
                    try
                    {
     
                        byte[] bytes = new byte[256];
                        ((Socket)sock).Receive(bytes);
                        MessageBox.Show(Encoding.UTF8.GetString(bytes) + "\n");
     
                    }
                    catch (SocketException s)
                    {
     
                    }
                }
            }
    Cette méthode écoute en continue la socket pour recevoir les messages.

    Mon problème est que fonctionnellement quand l'utilisateur ferme sa fenêtre de conversation, je ferme la socket --> Socket.close().

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    private void Fenetre_FormClosed(object sender, FormClosedEventArgs e)
            {
     
                threadListen.Abort();
                SockConnection.Close();
            }
    Donc voilà j'arrête le thread d'écoute et je ferme la socket commune aux deux mecs qui se parlent.

    Et, là, il se produit quelque chose de bizarre, le thread d'écoute de l'interlocuteur qui a encore sa fenêtre de conversation ouverte, reçoit des messages sans rien dedans, en convertissant en string, j'ai vu qu'il n'y a que des caractères vides ( \0), donc comment se fait-il qu'en fermant la socket commune, cela envoie des messages vide à son interlocuteur???

    Je sais pas si je me fais bien comprendre mais c'est réellement ce qui se passe!!

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Je sais pas si le problème est lié à ça, mais perso j'aurais fermé la socket avant d'arrêter le listener...

  3. #3
    Membre du Club
    Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Novembre 2006
    Messages
    113
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Novembre 2006
    Messages : 113
    Points : 45
    Points
    45
    Par défaut
    ué je vais essayer mais le problème c'est que c'est le listener adverse qui reçoit du "vide", c'est-à-dire le listener de la personne qui à encore la fenêtre de conversation ouverte, et qui ne sait pas, que son pote, lui, vient de la fermer.

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Points : 39 749
    Points
    39 749
    Par défaut
    Ben en fait j'en sais pas assez sur ton architecture pour pouvoir vraiment comprendre le problème...

  5. #5
    Expert éminent Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Points : 7 903
    Points
    7 903
    Par défaut
    des messages sans rien dedans
    Si je me souviens bien, le socket envoie ce type de messages de longueur 0 en cas d'erreur ou de déconnexion. Ce ne sont pas des "vrais" messages envoyés par l'appli distante.
    " Le croquemitaine ! Aaaaaah ! Où ça ? " ©Homer Simpson

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Points : 122
    Points
    122
    Par défaut
    Bonjour,

    Tu ne reçois rien du tout : Receive renvoie 0 (lit la doc) mais comme tu ne vérifies pas tu affiches ce qu'il y a dans bytes : des 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    Socket socket = (Socket)sock;
    while(
    ...
     
    int count = socket.Receive(bytes);
    if( count == 0 ) 
        break;
     
    MessageBox.Show( Encoding.UTF8.GetString(bytes, 0, count) );
    ...
    Pascal

  7. #7
    wogkiller
    Invité(e)
    Par défaut
    j'ai fait un serveur qui détecte tout seul les clients déconnecté. Pour cela, je lance un thread qui ne fait que ça.

    voila le code de mon thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    private void clientEnVie()
            {
                while (true)
                {
                    //parcour de tout les sockets de clients connectés
                    for (int i = 0; i < socketClients.Count; i++)
                    {
                        if (socketClients[i].Poll(10, SelectMode.SelectRead) && socketClients[i].Available == 0)
                        {//si le client est déconnecté, on le supprime proprement du serveur                        
                            try
                            {
                                threadClients[i].Abort();//je ferme mon thread liés au client déconnecté
                                threadClients.RemoveAt(i);
                                socketClients[i].Shutdown(SocketShutdown.Both);
                                socketClients[i].Close();//je ferme la connexion
                                socketClients.RemoveAt(i);
                            }
                            catch (Exception ex)
                            { }
                        }
                    }
                    Thread.Sleep(5000);//on endort le thread pour 5 secondes
                }
            }

Discussions similaires

  1. [Socket] server closed exception, readLine()
    Par ceres02 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 22/06/2007, 18h25
  2. Réponses: 3
    Dernier message: 27/07/2006, 17h01
  3. Réponses: 3
    Dernier message: 13/06/2006, 14h52
  4. [swing][socket]méthode ServerSocket.accept() bloquante?
    Par the_ugly dans le forum EDT/SwingWorker
    Réponses: 6
    Dernier message: 07/11/2005, 11h15
  5. [C#] Form : Quelles méthodes ? Close, Dispose, Show, Hide
    Par TheSeb dans le forum Windows Forms
    Réponses: 9
    Dernier message: 30/05/2005, 16h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo