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 :

Fermeture du Socket


Sujet :

C#

  1. #1
    Membre régulier Avatar de Wirbelwind
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 47
    Points : 109
    Points
    109
    Par défaut Fermeture du Socket
    Salut à tous !

    Je suis ici ce soir car j'ai un petit problème... ( eh oui, encore un! )

    Malgré mes recherches, je ne trouve pas grand-chose
    ( ou bien mon cerveau qui n'est pas assez gros ? )

    J'aime bien le dev, et j’apprends de moi-même,
    alors plus vous pourrez m'apprend, et plus je serais :


    Enfin bref, je suis actuellement entrai de développer une application qui
    communique en TCP avec d'autres ( architecture client-serveur )

    Dans ce cas, de multiples clients peuvent se connecter au "serveur"


    Seulement je rencontre quelques problèmes lors de la fermeture du Socket


    Voici mon code ( le plus simple possible )


    Classe TcpClient : prévue pour traiter chaque client séparément

    Classe :

    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
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    		private int maxConnections = 1;
    		// socket principal
    		public Socket socketHandler;
    		// liste des clients connectés
    		public HashSet<TcpClient> clients = new HashSet<TcpClient>();;
     
     
    		public Boolean startListening(int _port, int _maxConnections)
    		{
    			try
    			{	
    				this.maxConnections = _maxConnections;
     
    				//bind et listen
    				socketHandler = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
    				socketHandler.Bind(new IPEndPoint(IPAddress.Any, _port));
    				socketHandler.Listen(this.maxConnections);
     
    				socketHandler.BeginAccept(new AsyncCallback(newConnection), socketHandler);
    			}
    			catch()
    			{
    			}
    		}
     
    		private void newConnection(IAsyncResult iAr)
    		{
    			try
    			{
    				Socket socket = ((Socket)iAr.AsyncState).EndAccept(iAr);
     
    				// "Nouvelle connection !"
     
                                    // ajout
    				clients.Add(new TcpClient(socket, clientCount));
     
    			}
    			catch()
    			{
     
    			}
     
                       socketHandler.BeginAccept(new AsyncCallback(newConnection), socketHandler);
     
    		}
     
    	}

    Maintenant la fonction qui ferme ce socket :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    public void destroy()
    {
         foreach (TcpClient client in clients)
         {
         // appel de fonction de fermeture de tous les clients listés
         client.Disconnect();
         }
     
         clients = null;
    }
    Jusque là tout va bien

    D'après la doc, pour fermer le socket :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    socketHandler.Shutdown (SocketShutdown.Both);
    Erreur : je reçoit aussi une connexion de la part de "newConnection"
    Avec l'erreur : Une requête d'envoi ou de réception de données n'a pas été autorisée car le socket n'est pas connecté

    puis :

    Erreur : je reçoit une connexion de la part de la fonction "newConnection"
    Avec l'erreur : "Impossible d'accèder à un objet supprimé", ce que es logique puisque qu'il est fermé ...



    Là je suis un peu à sec ... si quelqu'un voit comment faire, il est le bienvenu !

    Je pense avoir tout expliqué, plus ou moins clairement


    Je vous remercie d'avance pour votre aide
    .

  2. #2
    Membre expert


    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2006
    Messages
    970
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : Belgique

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

    Informations forums :
    Inscription : Avril 2006
    Messages : 970
    Points : 3 304
    Points
    3 304
    Par défaut
    oula c'est loin tout ca ;-) .

    J'ai l'impression que tu reçois une nouvelle connexion qui prend comme objet celui dont tu es en train de fermer le socket ce qui pourrait te donner les erreurs que tu as.

    A mon avis un breakpoint sur la ligne pourrait t'aider
    Articles sur les technologies .NET

    Une réponse vous a aidé ? utilisez le bouton

    Votre problème est résolu ? utilisez le bouton

  3. #3
    Membre régulier Avatar de Wirbelwind
    Homme Profil pro
    Développeur Web
    Inscrit en
    Janvier 2012
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2012
    Messages : 47
    Points : 109
    Points
    109
    Par défaut
    Si c'est trop loin, il vaut mieux ne pas trop
    forcer, on ne sait jamais

    Bref, merci pour votre réponse

    Je vais essayer de voir ça / de me documenter, même
    si je ne vois pas vraiment comment faire autrement ...

  4. #4
    Membre averti
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2008
    Messages
    231
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 231
    Points : 359
    Points
    359
    Par défaut
    Bonjour,

    1- Je pense que tu dois te tromper quelque part:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    foreach (TcpClient client in clients)
         {
         // appel de fonction de fermeture de tous les clients listés
         client.Disconnect();
         }
    La fonction Disconnect() n'existe pas dans la class TcpClient du Framework. (ici)

    2- Je pense que sur le coup tu dois appeler Close() et je pense qu'elle doit clore aussi ton socket ... et comme tu partages le même socket avec tous tes clients .... désolé j'ai mal lu ton code

    3- Qu'elles sont les Trigger de connection/déconnection côté clien et côté server. Voici le scénario auquel je pense:
    1. Création du server
    2. Création du client
    3. Connection Client
    4. Création du socket, mise en ligne (Server)
    5. Disconnect côté server
    6. (En parallèle) Reconnection client
    7. (En parallèle) Fermeture Socket principale du server
    8. Erreur


    Es ce que tu penses que tu pourrais être dans ce cas là ? es ce que ton client peut se reconnecter automatiquement, soit via les class que tu utilises soit par du code que tu as fait ?
    "Une belle citation est un diamant au doigt de l'homme d'esprit et un caillou dans la main d'un sot."
    Joseph Roux

Discussions similaires

  1. [DOM] Fermeture de Socket apres parsage XML
    Par Ange-Louis dans le forum Format d'échange (XML, JSON...)
    Réponses: 3
    Dernier message: 14/04/2008, 17h10
  2. Problème de fermeture de sockets
    Par Shredder dans le forum Web & réseau
    Réponses: 28
    Dernier message: 15/09/2007, 09h21
  3. fermeture de socket
    Par youp_db dans le forum Réseau
    Réponses: 2
    Dernier message: 15/09/2006, 16h23
  4. Fermeture de socket me pose problème !
    Par MonsieurAk dans le forum Réseau
    Réponses: 2
    Dernier message: 15/05/2006, 23h03
  5. [Linux] Probleme de fermeture de Sockets
    Par diefo dans le forum Réseau
    Réponses: 6
    Dernier message: 30/12/2003, 13h10

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