Reception de message TCP difficile en mode Asynchrone
Bonjour, j'ai un probleme avec un application TCP que j'essaie de faire.
Elle envoie un message à un serveur, qui lui retourne des enregistrement de valeurs (séparés par des virgules). Le problème est que je ne peux prévoir la grandeur de ces enregistrement (souvent plus que 1000 enregistrements) donc je ne peux fixer mon buffer, ce qui m'oblige à faire plusieurs lecture.
Voici le code tiré de la classe TcpSocket qui communique avec le serveur TCP
Code:
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
|
privatevoid WaitForData()
{
if (pfnCallBack == null)
pfnCallBack = newAsyncCallback(OnDataReceived);
// now start to listen for any data...
m_asynResult = client.BeginReceive(m_DataBuffer, 0, m_DataBuffer.Length, SocketFlags.None, pfnCallBack, null);
}
publicvoid OnDataReceived(IAsyncResult asyn)
{
//end receive...
int iRx = 0;
iRx = client.EndReceive(asyn);
char[] chars = newchar[iRx + 1];
System.Text.Decoder d = System.Text.Encoding.UTF8.GetDecoder();
int charLen = d.GetChars(m_DataBuffer, 0, iRx, chars, 0);
System.String szData = new System.String(chars);
if (isNewData)
{
isNewData = false;
receivedData = szData;
}
else
{
receivedData = receivedData + szData;
}
WaitForData();
}
// Fonction sendMessage
// -- Sert a envoy‚ un message … l'h“te de la connection client
// -- Re‡oit en parametre un message de type string
// -- Envoie un erreur … la console si il y a un problŠme
publicvoid sendMessage(String message)
{
try
{
message = message + "\r\n";
byte[] byData = System.Text.Encoding.ASCII.GetBytes(message);
isNewData = true;
client.Send(byData);
WaitForData();
}
catch (SocketException se)
{
MessageBox.Show(se.Message);
}
}
publicstring getMessage()
{
string retour;
if (receivedData != "")
{
retour = receivedData;
}
else
{
retour = "ChaŒne vide!";
}
return retour;
}
|
ce code est appelé par un bouton dans un formulaire extérieur de cette façon :
Code:
1 2 3 4
|
unClient.sendMessage(message);
reponse = unClient.getMessage();
|
Il semble que la variable réponse soit rempli trop rapidement car la réponse attendu du serveur arrive après son affectation par "getMessage()"
Y aurait-il un mécanisme que je pourrait utilisé pour différé son affectation, ou une technique qui m'échappe, car je suis un peu nouveau dans ce type d'opérations.
Merci
FadeOut