Comment détruire un objet???

Résolu
NeoManox Messages postés 5 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 19 février 2009 - 18 févr. 2009 à 16:50
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 - 19 févr. 2009 à 18:23
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

RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
19 févr. 2009 à 18:23
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.
3
RougailSaucisse Messages postés 118 Date d'inscription lundi 16 février 2009 Statut Membre Dernière intervention 6 décembre 2010 1
18 févr. 2009 à 18:18
hum ne faudrait-il pas faire un serverSocket.Close()?
0
cs_vagg Messages postés 102 Date d'inscription vendredi 13 juin 2008 Statut Membre Dernière intervention 24 janvier 2013
19 févr. 2009 à 09:51
Je pense qu'un serverSocket.Dispose(); serait bien sympa aussi. Au moins ça libère totalement les ressources.
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 60
19 févr. 2009 à 10:26
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-
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
NeoManox Messages postés 5 Date d'inscription jeudi 4 novembre 2004 Statut Membre Dernière intervention 19 février 2009
19 févr. 2009 à 11:21
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}
0