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 :

Socket Receive / Problème avec buffer


Sujet :

C#

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 71
    Par défaut Socket Receive / Problème avec buffer
    Bonjour,

    J'ai un souci avec mon code de réception d'infos d'un serveur, en utilisant le type Socket.

    En gros, j'envoie une string XML (en POST) à un serveur SQL, et il devrait me renvoyer une liste de clients (par ex) ...

    Mais j'ai un souci, avec le buffer, je l'ai déclaré en 1024, avec un while >0 mais je pense que dans la string de sortie, lorsqu'il doit concaténer la string test dans le while lorsque le buffer byte2 est plein (voir code en dessous) il doit "laisser passer des infos" pendant le moment où il concatène et le moment où il va re-recevoir les données, car dans le fichier de résultat j'ai des vides parfois (quand y a le souci) et donc la génération du XML résultat ne passe pas.

    Voilà mon 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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    Socket m_socListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                try
                {
                    System.Net.IPAddress ipAdd = System.Net.IPAddress.Parse(adresse);
                    System.Net.IPEndPoint remoteEP = new System.Net.IPEndPoint(ipAdd, port);
                    m_socListener.Connect(remoteEP);
    
                    try
                    {
                        byte[] byte2 = new byte[1024];
                        
                        String test = "";
                        byte[] byData = System.Text.Encoding.ASCII.GetBytes(last);
                        int i = m_socListener.Send(byData);
                        if (i > 0)
                        {
                            while (m_socListener.Available == 0) ;
    
                            while (m_socListener.Receive(byte2, 1024, SocketFlags.None) > 0)
                            {
                                test += System.Text.Encoding.ASCII.GetString(byte2);
                            }
    
                            StreamWriter ecr = new StreamWriter("C:\\Users\\user\\Desktop\\sqldeveloper\\sqldeveloper\\test.txt");
                            ecr.Write(test);
                            ecr.Close();
    
                            System.Xml.XmlDocument doc = new System.Xml.XmlDocument();
                            doc.LoadXml(test);
                            
                            [...]
                            else
                            {
                                m_socListener.Close();
                                return "false";
                            }
                        }
                        else
                        {
                            m_socListener.Close();
                            return "Erreur d'envoi des données !";
                        }
                    }
                    catch (SocketException se)
                    {
                        m_socListener.Close();
                        return se.Message;
                    }
                }
                catch (SocketException se1)
                {
                    return "Le serveur ne répond pas. Veuillez nous excuser pour ce désagrément. L'erreur renvoyée est : " + se1.Message;
                }
    La partie en gras ...
    J'ai cherché, mais on peut pas avoir de buffer dynamique ... donc je vois pas pourquoi j'ai ce souci lorsque j'exécute la page asp qui doit afficher le tableau après (génération du XML avec un LoadXML):
    La balise de début 'date' sur la ligne 107 à la position 2 ne correspond pas à la balise de fin de 'desc'. Ligne 109, position 57.
    Si je change la taille du buffer et de byte2, j'ai l'erreur ailleurs, donc ça vient de là, mais je comprends pas !
    Ou alors c'est le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    System.Text.Encoding.ASCII.GetBytes(last)
    qui doit poser soucis ? (ca serait autre chose que du ASCII...)

    Merci d'avance !

  2. #2
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut
    Salut,

    La méthode Receive te retourne le nombre de bytes réellement lu.
    Tu pourrais utiliser cette valeur pour convertir le tableau d'octets en chaine de caractères, t'assurant ainsi que tu ne convertiras que ce que tu as reçu et non pas 1024 bytes à chaque itération.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int bytesRead = 0;
     
    while ((bytesRead = m_socListener.Receive(byte2, 1024, SocketFlags.None)) > 0)
    {
        test += System.Text.Encoding.ASCII.GetString(byte2, 0, bytesRead);
    }

  3. #3
    Expert confirmé Avatar de Graffito
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    5 993
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 5 993
    Par défaut
    As-tu tenu compte du fait que que x envois peuvent donner lieu à y receptions?
    Par exemple, on doit pouvoir traiter le fait qu'un "send" de 40K puisse occasionner 3 "receive" (un de 8K + un de 20K + un de 12K) ou, dans ton cas précis, que 2 send de 1024 puissent générer un unique receive de 2048.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2010
    Messages
    71
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 71
    Par défaut
    Merci à tous pour vos réponses

    J'ai trouvé une autre solution, plus simple .... utiliser StreamReader/Writer ^^

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TcpClient m_socListener = new TcpClient(adresse, port);
    StreamWriter sw = new StreamWriter(m_socListener.GetStream());//ecrir un flu
    sw.Write(last); // last est la string d'envoi, avec le POST et le XML
    sw.Flush();
    test = sr.ReadToEnd();
    et ça marche ^^
    Socket doit pas être bon ....

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

Discussions similaires

  1. [FLASH MX2004] [XMLSocket] Problème avec serveur socket php
    Par cocodunombril dans le forum Flash
    Réponses: 4
    Dernier message: 03/04/2009, 02h10
  2. problème avec buffer
    Par minooo dans le forum AWT/Swing
    Réponses: 15
    Dernier message: 01/02/2008, 23h16
  3. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15
  4. [socket] Problème avec les options
    Par gangsoleil dans le forum Développement
    Réponses: 3
    Dernier message: 13/07/2005, 13h11
  5. socket : problème avec GetHostByName
    Par SteelBox dans le forum Réseau
    Réponses: 25
    Dernier message: 19/08/2003, 13h49

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