Socket tcp en c# comment libérer de la mémoire tampon d'entrée?

Je suis en train d'écrire une application pour windows phone et j'ai besoin de communiquer avec un serveur et de transmettre des données. Le SERVEUR est écrit en C++ et je ne peut pas le modifier. Le CLIENT est ce que j'ai à écrire. Le Serveur est conçu de telle sorte que le client s'y connecter et transmettre des données. La connexion reste ouverte pour toute la transmission. En écrivant mon code en C#, je suis en mesure de recevoir des données à partir du serveur, mais après la première réception, les données que j'ai lu dans la mémoire tampon sont toujours les mêmes. J'ai donc besoin d'un moyen de vider le tampon d'entrée afin que je puisse recevoir les nouvelles données (les données sont envoyées en continu). Je suis l'aide de la classe définie dans ici:

http://msdn.microsoft.com/en-us/library/windowsphone/develop/hh202858%28v=vs.105%29.aspx

merci beaucoup !!

J'ai utilisé ce code pour Recevoir dans le SocketClient.cs :

public string Receive()
{
string response = "Operation Timeout";
//We are receiving over an established socket connection
if (_socket != null)
{
//Create SocketAsyncEventArgs context object
SocketAsyncEventArgs socketEventArg = new SocketAsyncEventArgs();
socketEventArg.RemoteEndPoint = _socket.RemoteEndPoint;
//Setup the buffer to receive the data
socketEventArg.SetBuffer(new Byte[MAX_BUFFER_SIZE], 0, MAX_BUFFER_SIZE);
//Inline event handler for the Completed event.
//Note: This even handler was implemented inline in order to make 
//this method self-contained.
socketEventArg.Completed += new EventHandler<SocketAsyncEventArgs>(delegate(object s, SocketAsyncEventArgs e)
{
if (e.SocketError == SocketError.Success)
{
//*********************************************
//THIS part of the code was added to receive 
//a vector of 3 double
Double[] OdomD = new Double[3];
for (int i = 0; i < 3; i++)
{
OdomD[i] = BitConverter.ToDouble(e.Buffer, 8 * i);
}
//*********************************************
}
else
{
response = e.SocketError.ToString();
}
_clientDone.Set();
});
//Sets the state of the event to nonsignaled, causing threads to block
_clientDone.Reset();
//Make an asynchronous Receive request over the socket
_socket.ReceiveAsync(socketEventArg);
//Block the UI thread for a maximum of TIMEOUT_MILLISECONDS milliseconds.
//If no response comes back within this time then proceed
_clientDone.WaitOne(TIMEOUT_MILLISECONDS);
}
else
{
response = "Socket is not initialized";
}
return response;
}

La méthode Connect() est exactement la même signalé dans le lien ci-dessus. Ainsi, lorsque le démarrage de l'application, la méthode Connect() est appelée comme suit:

SocketClient client = new SocketClient();
//Attempt to connect to server for receiving data
Log(String.Format("Connecting to server '{0}' over port {1} (data) ...", txtRemoteHost.Text, 4444), true);
result = client.Connect(txtRemoteHost.Text, 4444);
Log(result, false);

Qui est en fait juste une fois au début, puis j'ai besoin de recevoir cet ensemble de 3 double qui est mis à jour chaque seconde. J'utilise donc:

Log("Requesting Receive ...", true);
result = client.Receive();
Log(result, false);

Le problème est que si je déboguer le code et arrêter l'exécution à l'intérieur de Recevoir(), je lis toujours la même valeur, c'est la première valeur envoyée par le serveur. Ce que j'attends, c'est que chaque fois que j'appelle le client.Recevoir(), je reçois la nouvelle valeur, mais ce n'est pas appening.

J'ai eu un problème similaire par écrit le même client dans l'environnement Matlab. J'ai résolu le problème en utilisant la fonction flushinput(t) avant de lire la mémoire tampon d'entrée. De cette façon j'ai pu lire toujours les dernières données envoyées par le serveur. Je suis lookin pour une fonction similaire à celle d'un ..

La taille de la mémoire tampon d'entrée est fixé égal au nombre de données que je m'attends à recevoir, dans ce cas, est de 24 octets ( 3* sizeof(double) ) ..

Merci beaucoup pour votre temps !!

  • On dirait que vous devez mettre cette méthode result = client.Receive(); dans un while(true) boucle (à partir de l'article que vous avez mis en lien).
  • Fondamentalement, vous avez un bug dans votre code, mais je n'ai pas compris votre code. Le contenu de la mémoire tampon devrait changer chaque fois que vous obtenez l'achèvement de la async-recevoir. Remarque, en particulier, de vérifier combien d'octets ont été reçus (très rarement lire l'intégralité d'un tampon). S'il vous plaît montrer la corporation de recevoir / lire le code. Nous ne pouvons pas le réparer par la conjecture seul.
  • J'ai ajouté le code .. merci pour votre aide !!
InformationsquelleAutor Emanuele | 2013-05-22