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 :

Exception levée par TcpClient()


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut Exception levée par TcpClient()
    Bonjour à tous !
    voila je suis en BTS IG et dans le cadre de mes (futurs) oraux je doit présenter des programmes en differents langages.

    En alternance, j'ai pas enormement de temps de cours, j'avance donc en tentant d'apprendre des langages par moi même.

    En ce moment c'est C# et ce fameux framework Dot Net.
    Seulement voila, j'ai pour m'exercer, recuperer sur internet un code source d'un prog C# de Chat en reseau.

    J'essaye de comprendre encore le fonctionnement global, et de modifier, améliorer et personnalisé le code afin de m'en servir pour mes projets.

    J'ai une fonction qui permet de me connecter en tant que client.
    Seulement je me trouve face à une exception levée sans que je ne comprenne vraiment pourquoi.

    L'exception est la suivante:
    "impossible de connecter à : 127.0.0.1 l'ordinateur cible l'a expressément refusé"
    J'utilise le port 8100.

    voici ma fonction:

    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
     
            /* fonction de connection en tant que client */
            private void clientConnect()
            {
                /* label de l'application */
                this.Text = "Client - " + Pseudo.Text;
     
                /* On récupère sous forme de chaîne l'ip saisie par l'utilisateur */
                string IpServeur = Adresse.Text;
     
                if (Pseudo.Text == "" || Adresse.Text == "" || Port.Text == "")
                {
                    MessageBox.Show("Tous les champs doivent être remplis");
                }
                else
                {
                    if (InvokeRequired)
                    {
                        this.Invoke(new MethodInvoker(delegate() { clientConnect(); }));
                    }
                    else
                    {
                        /* si le boolean connexion est à true, on est deja connecté */
                        if (connexion == true)
                        {
                            MessageBox.Show("vous êtes déja connecté");
                        }
                        else
                        {
                            try
                            {
                                /* Création d'un objet de type TcpClient avec l'ip et le port défini auparavant */
                                MonClientTCP = new TcpClient(IpServeur, usePort);
     
                                /* On récupère la chaîne de connexion créée avec les arguments de l'objet TcpClient */
                                unNS = MonClientTCP.GetStream();
     
                                /* initialisation du thread d'ecoute */
                                ThreadEcoute = new Thread(new ThreadStart(ecoute));
     
                                /* On demarre le thread "ecoute" */
                                ThreadEcoute.Start();
     
                                /* On définit un objet de type StreamWriter avec le NetworkStream en argument */
                                unSW = new StreamWriter(unNS);
     
                                /* On définit un objet de type StreamReader avec le NetworkStream en argument */
                                unSR = new StreamReader(unNS);
     
                                /* Notre StreamWriter enverra de manière automatique les informations sur Networkstream */
                                unSW.AutoFlush = true;
     
                                /* On informe le client que la connexion est démarrée */
                                unSW.WriteLine("Connexion établie");
     
                                /* le booléen connection passe à vrai */
                                connexion = true;
     
                                /* une fois la connexon effective on envoie un message a l'utilisateur */
                                TexteWidows.Text += inputLine;
                            }
                            catch (System.Exception ex)
                            {
                                /* on informe l'utilisateur d'un éventuel echec de fermeture d'un des objets */
                                MessageBox.Show(ex.Message);
                            }
                        }
                    }
                }
            }
    L'exception est levée à ce moment:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    unNS = MonClientTCP.GetStream();
    J'ai vérifier sur le net, je n'ai pas de pare feu actif

    Voila si des gens on eu le même soucis et peuvent m'eclairer un peu, cela m'aiderais fort.

    De plus si quelqu'un à une explication sur les safe-threads nottament grâce à ce bout de code, j'ai mis ce bout de code mais sans vraiment comprednre l'enjeux sur le net les explications sont, pour moi, floues:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                   if (InvokeRequired)
                    {
                        this.Invoke(new MethodInvoker(delegate() { clientConnect(); }));
                    }
                    else
                    {
    Merci d'avance à tous !

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    Est-ce qu'il y a un programme (serveur) qui écoute sur ton port 8100 ?

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Citation Envoyé par Kaidan Voir le message
    Est-ce qu'il y a un programme (serveur) qui écoute sur ton port 8100 ?
    en effet je n'avais pas fait gaffe à cela o_O.
    Une autre instance de mon prog est censé se connecter en tant que serveur.

    Le problème du client est donc en fait pas le vrai problème.

    la fonction pour se connecter en tant que serveur:
    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
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
            private void AttenteConnexion()
            {
                if (Pseudo.Text == "" || Adresse.Text == "" || Port.Text == "")
                {
                    MessageBox.Show("Tous les champs doivent être remplis");
                }
                else
                {
                    if (InvokeRequired)
                    {
                        this.Invoke(new MethodInvoker(delegate() { AttenteConnexion(); }));
                    }
                    else
                    {
                        /* label de l'application */
                        this.Text = "Serveur - " + Pseudo.Text; 
     
                        if (connexion == true)
                        {
                            MessageBox.Show("vous êtes déja connecté");
                        }
                        else
                        {
                            try
                            {
                                /* On récupère l'adresse ip de connexion */
                                IPAddress IpServeur = IPAddress.Parse(Adresse.Text);
     
                                /* On initialise le TcpListener en utilisant l'ip entrée par l'utilisateur et le port défini auparavant */
                                MonEcouteurTCP = new TcpListener(IpServeur, usePort);
     
                                /* On déclenche l'écoute du serveur */
                                MonEcouteurTCP.Start();
     
                                /* On définit une socket */
                                maSocket = MonEcouteurTCP.AcceptSocket();
     
                                /* initialisation du thread */
                                ThreadEcoute = new Thread(new ThreadStart(ecoute));
     
                                /* On start le thread "ecoute" */
                                ThreadEcoute.Start();
     
                                /* On définit un objet de type NetworkStream avec la socket en argument */
                                unNS = new NetworkStream(maSocket);
     
                                /* On définit un objet de type StreamWriter avec le NetworkStream en argument */
                                unSW = new StreamWriter(unNS);
     
                                /* On définit un objet de type StreamReader avec le NetworkStream en argument*/
                                unSR = new StreamReader(unNS);
     
                                /* Notre StreamWriter enverra de manière automatique les informations sur Networkstream */
                                unSW.AutoFlush = true;
     
                                /* On informe le client que la connexion est démarrée */
                                unSW.WriteLine("Connection établie");
     
                                /* le booléen ecoute passe à vrai */
                                connexion = true;
     
     
     
                                /* une fois la connexon effective on envoie un message a l'utilisateur */
                                TexteWidows.Text += inputLine;						
                            }
                            catch (System.Exception ex)
                            {
                                /* on informe l'utilisateur d'un éventuel echec de fermeture d'un des objets */
                                MessageBox.Show(ex.Message);
                            }
                        }
                    }
     
                }
            }
    Je me connecte avec mon instance serveur donc et voila ce qui se passe:
    il met beaucoup de temps à répondre 30s/1min, il semble que c'est cette ligne qui ralentisse le tout:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
                                /* On définit une socket */
                                maSocket = MonEcouteurTCP.AcceptSocket();
    Merci

  4. #4
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    bonjour,

    je pense que le probleme est que votre client ne se connect pas a votre serveur pour cela lorsque vous essayez de instance un stream(flux) de votre socket il y'a une exception

    concernant le bout c pour evitez le thread cross

    c lorsque un thread essai de modifie une compasante cree par un autre pour cela on cree une delegue sur une fct en suite il lui invoke depuis une compasante.

    bon courage

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 8
    Par défaut
    Un collegue m'as dit que le métier n'étant pas détaché du visuel, l'application (visuel) se bloque et donc attend un client. (getStream())
    Ce qui donne l'impression d'un freeze.
    Un thread au démarrage éviterais ce genre de problème apparemment.
    Je vais regarder par la.

    Merci

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Juillet 2007
    Messages
    1 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 277
    Par défaut
    AcceptSocket est bloquant en effet. Le code est bloqué sur l'instruction jusqu'à ce qu'un client se connecte.

    Il existe également en asynchrone BeginAcceptSocket sans avoir besoin de créer un nouveau thread manuellement.

  7. #7
    Membre Expert
    Avatar de azstar
    Homme Profil pro
    Architecte Technique BizTalk/.NET
    Inscrit en
    Juillet 2008
    Messages
    1 198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Architecte Technique BizTalk/.NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 198
    Par défaut
    bonjour,

    si vous lance votre programe par exemple dans prosedure Form_load

    application ce bloque jusqu'a etablire une connexion ou cas contraire une exception pour evite ca il faut lance un thread en paralelle mais ca peut amene a un cross thread surtt lorsque vous essai par exemple de modifie un textbox


Discussions similaires

  1. Exception levée par l'initialiseur de type
    Par beretb dans le forum C#
    Réponses: 6
    Dernier message: 04/06/2009, 15h26
  2. Exception levée par l'initialiseur de type
    Par ted_2.3 dans le forum VB.NET
    Réponses: 5
    Dernier message: 02/05/2008, 23h14
  3. Réponses: 3
    Dernier message: 29/11/2007, 10h37
  4. Expliciter une exception levée par un objet OLE
    Par Bleuarff dans le forum Windows
    Réponses: 3
    Dernier message: 12/05/2005, 16h10

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