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