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 de taille lors d'un envoi sur socket


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 100
    Par défaut Problème de taille lors d'un envoi sur socket
    Bonjour,

    J'ai un petit problème lors d'un envoi par une socket. Donc voila en gros une partie de mon application : un client envoie une requête à mon serveur et pour cette requête, mon serveur va rechercher des noms dans une base de données et les stocke dans une List<String>. Ensuite mon serveur concatène tout les noms espacés par le caractère "$" et le stocke dans un simple String. Dans mon exemple, mon serveur trouve une trentaine de nom et les concatène bien et les envoie. Le problème se situe sur mon client, il ne réceptionne que la moitié de ce que j'ai envoyé Je me demandais s'il y avait une limite de données à envoyer ?

    Enfin voila mes bouts de codes :

    Code 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
    static void ReceptionRealisee(IAsyncResult ar)
            {
                Socket socketServ = (Socket)ar.AsyncState;
     
                int n = socketServ.EndReceive(ar);
                String msgClient = ASCIIEncoding.Default.GetString(buf, 0, n);
     
                String msgServeur = "nogapprotocol";
     
                #region analyse de la trame recue par le client
     
                List<String> maListe = DecoupeTrame.decoupage(msgClient);
     
                if (maListe != null)
                {
                    protocole = maListe[0];
     
                    int IDProtocole = Int32.Parse(protocole);
     
    #region Protocole GETALLFOURNISSEUR
     
                    if (IDProtocole == ProtocolGAP.GETALLFOURNISSEUR)
                    {
                        if (ConfigurationManager.AppSettings["cheminBDMercator"] == null)
                            throw new ExceptionPropertiesNotFound("Fichier de properties non disponible !");
                        else
                        {
                            String cheminMercator = ConfigurationManager.AppSettings["cheminBDMercator"];
     
                            ManipulationDBMercator manip = new ManipulationDBMercator(cheminMercator);
     
                            List<String> allFournisseur = manip.getAllFournisseur();
     
                            msgServeur = "";
                            msgServeur = ProtocolGAP.GETALLFOURNISSEUR.ToString()+"$";
     
                            MessageBox.Show(allFournisseur.Count.ToString());
     
                            foreach (String fou in allFournisseur)
                            {
                                msgServeur = msgServeur + fou + "$";
                            }
     
                            msgServeur = msgServeur + "#";
     
     
                            MessageBox.Show(msgServeur);
                        }
                    }
                    #endregion
     
    byte[] tb = ASCIIEncoding.Default.GetBytes(msgServeur);
     
                IAsyncResult e = socketServ.BeginSend(tb, 0, tb.Length, 0, new AsyncCallback(EnvoiRealise), socketServ);
     
                e.AsyncWaitHandle.WaitOne();
    }
    Donc en gros, il réceptionne une trame, qui est un String, et utilise une classe qui va la découper pour récupérer tout les éléments présent pour les mettre dans une List<String>. Ensuite, il se connecte à la base de données pour récupérer tout les noms pour ensuite les concaténer et les renvoyer vers le client.

    Pour le client :

    il utilise cette fonction pour réceptionner la trame :

    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
    public String ReceptionRequete()
            {
                byte[] buf = new byte[1024];
     
                try
                {
     
                    IAsyncResult ar = socketC.BeginReceive(buf, 0, buf.Length, 0, new AsyncCallback(ReceptionRealisee), socketC);
     
                    socketC.EndReceive(ar);
     
                    String msgServeur = ASCIIEncoding.Default.GetString(buf, 0, buf.Length);
     
                    List<String> liste = DecoupeTrame.decoupage(msgServeur);
     
                    if (liste[0].CompareTo("2") == 0)
                    {
                        socketC.Shutdown(SocketShutdown.Both);
                        socketC.Close();
                        msgServeur = "quit";
                    }
     
                    return msgServeur;
                }
                catch (SocketException ex)
                {
                    MessageBox.Show("Erreur de connexion !", "Erreur", MessageBoxButtons.OK, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1);
                    return null;
                }
            }
    qui va retourner le String et ensuite, il fait :

    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
    String retour = client.ReceptionRequete();
     
                List<String> templisteFournisseur = DecoupeTrame.decoupage(retour);
                List<String> listeFournisseur = new List<string>();
     
                foreach (String fou in templisteFournisseur)
                {
                    if (fou.CompareTo("3") != 0)
                    {
                        listeFournisseur.Add(fou);
                    }
                }
     
                //MessageBox.Show(listeFournisseur.Count.ToString());
     
                comboBoxFournisseur.DataSource = listeFournisseur;
    le foreach sert simplement pour ne pas récupérer le premier élément de la liste. Donc du coté de mon client, je n'ai pas le bon nombre de noms qui s'afficheront dans mon combo ...

    Auriez-vous une idée ?

    Merci d'avance,

    Julien

  2. #2
    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
    il réceptionne une trame, qui est un String
    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).

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 100
    Par défaut
    Bonjour,

    non j'ai pas tenu compte de ça ... Mais comment savoir combien de receive je vais recevoir ?

  4. #4
    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
    Mais comment savoir combien de receive je vais recevoir ?
    On peut encadrer un envoi texte entre 2 caractères spéciaux ou préfixer un buffer binaire par sa longueur.

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 100
    Par défaut
    Effectivement, c'est une bonne idée Je vais tester ça et je te tiens au courant Merci pour les astuces et bonne soirée

    Julien.

  6. #6
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2010
    Messages
    100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Février 2010
    Messages : 100
    Par défaut
    Un peu tard, mais ça marche Je marque le topic en résolu.

    Bonne journée

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/07/2015, 09h38
  2. [WD-2007] Problème d'encodage lors d'un enregistrement sur clé USB
    Par MadGics dans le forum Word
    Réponses: 2
    Dernier message: 04/05/2015, 10h51
  3. Réponses: 1
    Dernier message: 03/01/2011, 09h25
  4. Problèmes d'encodage lors de l'envoi d'un mail
    Par NeqO55 dans le forum Linux
    Réponses: 1
    Dernier message: 31/08/2007, 17h17
  5. Problème de taille de label d'abscisse sur un graphique
    Par Chrysomallus dans le forum MATLAB
    Réponses: 5
    Dernier message: 25/04/2007, 13h45

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