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 :

problème lors de l'utilisation de TcpClient


Sujet :

C#

  1. #1
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut problème lors de l'utilisation de TcpClient
    Bonjour,

    J'ai un probleme pour récuperer des données venant d'un serveur http.

    Je fais ma requete POST, mais quand j'attends la reponse, ca me lance l'exception : "Impossible de lire les données de la connexion de transport : Une connexion existante a dû être fermée par l’hôte distant."

    Voila ma requete que je fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    POST /login.htm HTTP/1.1
    Host: 192.168.1.110
    Content-type: application/x-www-form-urlencoded
    Content-Length: 46
     
    submitId=pwdLogin&password=password&submitEnd=
    Pourriez vous m'aider ?
    Merci.
    F.

  2. #2
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Bonjour,

    Je ne connais pas trop les requêtes html, mais tu parles d'un ClientTcp. Pourrais-tu préciser le contexte et comment tu envoies ta requête html?

  3. #3
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Merci de ta réponse.

    En faite, le "serveur web" est un switch qui contient une interface web.

    Voulant faire des programmes pour configurer automatiquement mon appareil, je dois envoyer des requetes. Ces requetes ont été identifiées.
    J'utilise également, comme autre methode :

    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
     
            public bool Connexion(string ip, string MotDePasse)
            {
                m_ip = ip;
                m_password = MotDePasse;
     
                var content = "submitId=pwdLogin&password=";
                content += MotDePasse;
                content += "&submitEnd=";
                var data = Encoding.ASCII.GetBytes(content);
     
                string uri = "http://" + ip + m_uri_login;
                HttpWebRequest _request = (HttpWebRequest)WebRequest.Create(new Uri(@uri));
                _request.Method = "POST";
                _request.ContentType = "application/x-www-form-urlencoded";
                _request.ContentLength = data.Length;
     
                using(var stream = _request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
     
                HttpWebResponse reponse = (HttpWebResponse)_request.GetResponse();
     
                if((reponse.StatusCode == HttpStatusCode.OK))
                {
                    if(reponse.Headers.AllKeys.Contains(Constantes.COOKIE_REPONSE_HEADER))
                        m_cookie = reponse.Headers[Constantes.COOKIE_REPONSE_HEADER];
                    return true;
                }
                return false;
            }
    Mais là c'est un peu près le meme probleme... :-/

  4. #4
    Membre expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Points : 3 404
    Points
    3 404
    Par défaut
    Ok, j'ai regardé un peu ce qu'en dit microsoft. Je suppose que tu t'en es inspiré, du moins tu as quelque chose de similaire.

    Je vais peut-être dire des bêtises, mais regarde du côté de ton stream. Toi tu as ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     using(var stream = _request.GetRequestStream())
                {
                    stream.Write(data, 0, data.Length);
                }
    Et si je ne m'abuse, une fois sorti du using, l'objet stream est détruit. Hors, ils indiquent la chose suivante :

    If you do not close the response or the stream, your application can run out of connections to the server and become unable to process additional requests.
    Hors, tu n'as pas appelé la méthode stream.Close().

  5. #5
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par ZenZiTone Voir le message
    Hors, tu n'as pas appelé la méthode stream.Close().
    Effectivement, il n'appelle pas la méthode Close. Mais comme il utilise un using (et donc un appel à Dispose) pour la gestion des ressources, cet appel est inutile.

    Peux-tu essayer sans utiliser "using" et en appelant la méthode Close à la place ? Car avec le using, tu détruits l'objet dès que tu sors du bloc via un appel à la méthode Dispose. Or, la requête n'est envoyée que lorsque tu appelles GetResponse. Donc, potentiellement, cela peut te créer quelque soucis (cela dépend entièrement de l'implémentation).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Citation Envoyé par dorinf Voir le message
    Effectivement, il n'appelle pas la méthode Close. Mais comme il utilise un using (et donc un appel à Dispose) pour la gestion des ressources, cet appel est inutile.

    Peux-tu essayer sans utiliser "using" et en appelant la méthode Close à la place ? Car avec le using, tu détruits l'objet dès que tu sors du bloc via un appel à la méthode Dispose. Or, la requête n'est envoyée que lorsque tu appelles GetResponse. Donc, potentiellement, cela peut te créer quelque soucis (cela dépend entièrement de l'implémentation).
    bonjour,
    Merci d'avoir répondu.

    Donc, j'ai fais ce code:

    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
              m_ip = ip;
                m_password = MotDePasse;
     
                var content = "submitId=pwdLogin&password=";
                content += MotDePasse;
                content += "&submitEnd=";
                var data = Encoding.ASCII.GetBytes(content);
     
                string uri = "http://" + ip + m_uri_login;
                HttpWebRequest _request = (HttpWebRequest)WebRequest.Create(new Uri(@uri));
                _request.Host = 
                _request.Method = "POST";
                _request.ContentType = "text/plain";
                _request.ContentLength = data.Length;
     
                var stream = _request.GetRequestStream();
                stream.Write(data, 0, data.Length);
                stream.Close();
     
                HttpWebResponse reponse = (HttpWebResponse)_request.GetResponse();
     
                if((reponse.StatusCode == HttpStatusCode.OK))
                {
                    if(reponse.Headers.AllKeys.Contains(Constantes.COOKIE_REPONSE_HEADER))
                        m_cookie = reponse.Headers[Constantes.COOKIE_REPONSE_HEADER];
                    return true;
                }
                return false;
            }
    Donc, ici je me connect au serveur web dans le switch.
    Cela marche, je recupere bien le cookie.

    :

    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 SetPortStatus(string port)
            {
                var content = port;
                var data = Encoding.ASCII.GetBytes(content);
     
                string uri = "http://" + m_ip + m_uri_login;
                HttpWebRequest _request = (HttpWebRequest)WebRequest.Create(new Uri(@uri));
                _request.Method = "POST";
                _request.ContentType = "text/plain";
                _request.Headers["Cookie"] = m_cookie;
                _request.ContentLength = data.Length;
     
                var stream = _request.GetRequestStream();
                stream.Write(data, 0, data.Length);
                stream.Close();
     
                _request.Abort();
            }
    Lors de la premiere série de connexions: connexion puis la request post réalisée dans "SetPortStatus", ok.
    Mais quand j'en fais une deuxieme, la connexion se passe bien mais ensuite, ca me fait lors du "SetPortStatus" : Impossible de se connecter au serveur distant au niveau du GetResquestStream. Comme si le serveur web est tombé.

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    Il y a une chose qui est étonnante dans ton code
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    var stream = _request.GetRequestStream();
    stream.Write(data, 0, data.Length);
    stream.Close();
     
    _request.Abort();

    Tu écris une requête et tu l'annules tout de suite après. Quel est l'intérêt de faire cela ?
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    C'etait un essai, pour voir ce qui se passait à vrai dire...

  9. #9
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Dans ce cas, récupères plutôt la réponse. Tu pourras ainsi voir si la première requête s'exécute véritablement correctement.

    Il se pourrait même que cela corrige le problème, car je ne suis pas sur que HttpWebRequest soit fait pour envoyer une requête sans appeler GetResponse derrière. Il faudrait a minima vérifier le code HTTP que tu obtiens en retour.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  10. #10
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Merci de l'information.
    donc, j'ai fais cela:

    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
     
            public void SetPortStatus(string port)
            {
                var content = port;
                var data = Encoding.ASCII.GetBytes(content);
     
                string uri = "http://" + m_ip + m_uri_login;
                HttpWebRequest _request = (HttpWebRequest)WebRequest.Create(new Uri(@uri));
                _request.Method = "POST";
                _request.ContentType = "text/plain";
                _request.Headers["Cookie"] = m_cookie;
                _request.ContentLength = data.Length;
     
                var stream = _request.GetRequestStream();
                stream.Write(data, 0, data.Length);
                stream.Close();
     
                _request.GetResponse();
            }
    Et j'ai "La demande a été abandonnée : Le délai d'attente de l'opération a expiré.." lors de la GetResponse.

  11. #11
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 760
    Points : 10 541
    Points
    10 541
    Billets dans le blog
    21
    Par défaut
    Il y a un manque dans ton code (je ne sais pas si la cause c'est ça dans le cas présent, mais elle peut l'être), alors autant y pallier.

    Il faut que tu appelles la méthode Close() sur la réponse que tu obtiens. C'est important de le faire à chaque fois pour libérer correctement les ressources de connexion. Donc il faut que tu le fasses aussi bien au moment où tu récupères le cookie que lorsque tu appelles ta méthode SetPortStatus.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  12. #12
    Membre confirmé Avatar de Flow_75
    Femme Profil pro
    Ingénieure
    Inscrit en
    Mai 2005
    Messages
    1 096
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieure
    Secteur : Transports

    Informations forums :
    Inscription : Mai 2005
    Messages : 1 096
    Points : 633
    Points
    633
    Par défaut
    Bon, j'ai résolu mon probleme.
    En faite, je ne voulais pas en arriver à là mais j'ai été obligé.
    J'ai utilisé le Webbrowser. Là ca marche. J'ai un autre probleme, mais cela ne concerne plus ce sujet !

    Merci beaucoup Dorinf de ton temps à résoudre ce probleme !
    F.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 27
    Dernier message: 25/10/2006, 12h10
  2. problème lors de l'utilisation de mon application
    Par dododi dans le forum Bases de données
    Réponses: 2
    Dernier message: 01/10/2006, 19h35
  3. Réponses: 3
    Dernier message: 16/08/2006, 10h26
  4. Problème lors de l'utilisation de opennreport
    Par willytito dans le forum Access
    Réponses: 1
    Dernier message: 20/07/2006, 21h00
  5. Problème lors de l'utilisation de FOP
    Par llaurentt dans le forum XML/XSL et SOAP
    Réponses: 7
    Dernier message: 12/05/2006, 15h49

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