Comment détruire un objet???

Résolu
Signaler
Messages postés
5
Date d'inscription
jeudi 4 novembre 2004
Statut
Membre
Dernière intervention
19 février 2009
-
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
-
Bonjour,

Je développe actuellement un programme de communication TCP/IP en C#.

Mon problème est le suivant: j'utilise une fonction pour lancer l'écoute du server, il est possible de l'appeler plusieurs fois (par exemple on veut relancer l'écoute après avoir changer de port)...Ce qu'il se passe: à chaque fois que je lance ma fonction, le programme conserve les anciennes instances de mon objet TcpListener c'est a dire que j'ouvre plusieurs port sans les refermer et si j'entre 2 fois le même port bien entendu j'ai une erreur.

Voila mon code pour la fonction:

        private void listener()
        {
            try
            {
                serverSocket = new TcpListener(getYourIP(), port);
                serverSocket.Start();
                if (infoLabel != null) writeString(infoLabel, "En attente de clients.", 0);
                serverSocket.AcceptSocket();
                infoLabel = null;
            }
            catch
            {
                if (infoLabel != null) writeString(infoLabel, "Echec de la connexion.", 2);
                infoLabel = null;
            }           
        }

Je pensais à qu'à l'origine le fait de recréer un objet TcpListener serverSocket suprimerais l'ancien mais ce n'est visiblement pasle cas, comment supprimer l'ancienne instance?!?

Merci d'avance.

5 réponses

Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
Pour ma part j'ai realisé un test similaire et ca fonctionne sans encombre:

TcpClient client;

server = new TcpListener(localAddr, port);
server.Start();
Console.WriteLine("Recpetion 1");
client= server.AcceptTcpClient();
//traitement de reception d'infos du client
client.close();
server.close();

server = new TcpListener(localAddr, port);

server.Start();
Console.WriteLine("Recpetion 2");
client = server.AcceptTcpClient();

//traitement de reception d'infos du client

client.close();

server.close();

il recoit bien mes infos envoyés par le client puis passe en "reception2" et recoit de nouveau les infos envoyés par le client.
Messages postés
118
Date d'inscription
lundi 16 février 2009
Statut
Membre
Dernière intervention
6 décembre 2010
1
hum ne faudrait-il pas faire un serverSocket.Close()?
Messages postés
102
Date d'inscription
vendredi 13 juin 2008
Statut
Membre
Dernière intervention
24 janvier 2013

Je pense qu'un serverSocket.Dispose(); serait bien sympa aussi. Au moins ça libère totalement les ressources.
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
58
Certains objets implémentant l'interface IDisposable possèdent une méthode Close() pour une question de logique (pour un fichier, c'est plus logique d'appeler une méthode Close que Dispose par exemple).
La méthode Close fera en interne un appelle à Dispose....

<hr />
-Blog-
-Site Perso-
Messages postés
5
Date d'inscription
jeudi 4 novembre 2004
Statut
Membre
Dernière intervention
19 février 2009

en effet le méthode close existe bien mais voila nouveau problème, impossible de recréer un objet après. voila mon code:

            try
            {
                if ((serverSocket != null) && (serverSocket.Server.IsBound))
                {
                    serverSocket.Server.Close();
                }
                serverSocket = new TcpListener(getYourIP(), port);
                serverSocket.Start();
                if (infoLabel != null) writeString(infoLabel, "En attente de clients.", 0);
                serverSocket.AcceptSocket();
                infoLabel = null;
            }

et voila l'exception que j'obtiens dès que j'essaye de manipuler mon objet serverSocket.

$exception    {"Une opération de blocage a été interrompue par un appel à WSACancelBlockingCall"}    System.Exception {System.Net.Sockets.SocketException}