Tcpclient - taille des paquets

Résolu
marcus_lambert Messages postés 5 Date d'inscription jeudi 3 novembre 2005 Statut Membre Dernière intervention 4 décembre 2007 - 4 déc. 2007 à 12:12
marcus_lambert Messages postés 5 Date d'inscription jeudi 3 novembre 2005 Statut Membre Dernière intervention 4 décembre 2007 - 4 déc. 2007 à 17:58
Bonjour,

Je cherche à faire une application client / serveur en utilisant tcpclient et tcplistener.

J'ai trouvé pas mal de sources sur le net, seulement j'ai un problème de conception.

Le client doit envoyer des chaines de carcatères le plus vite possible au serveur, puis ce dernier les passe à une autre application.
Je ne ferme donc jamais le flux entre les deux applications afin de gagner du temps.

Pour le moment les données sont ensuite envoyées par le client de cette manière:
<hr size="2" width="100%" />
private void SendCommand(string _strConnect)
{
            char[] cbuffer = new char[1024];
            NetworkStream ns = m_tcpClient.GetStream();
            StreamWriter sw = new StreamWriter(ns);
            sw.AutoFlush = true;

            sw.Write(_strConnect);
}

Côté serveur la reception:
    char[] cbuffer = new char[1024];
    NetworkStream ns = newclient.GetStream();
    StreamReader sr = new StreamReader(ns);

    int count = sr.Read(cbuffer, 0, 1024);
    if (count == 0)
    {
        Console.Out.WriteLine("client déconnecté");
    }

    else
    {
        Console.Out.WriteLine(new string(cbuffer, 0, count));
        //envoie de la chaine vers l'autre application
    }
<hr size="2" width="100%" />
Mon problème c'est qu'au bout d'un moment les chaines se mélangent. J'ai la fin de l'une avec le debut d'une autre ...

J'en suis arrivé à me dire que la méthode que j'utilise n'était peut être pas la bonne.
A la place du buffer j'ai tenté d'utiliser WriteLine et ReadLine mais j'ai eut à peu près le même problème.
J'ai ensuite essayé de d'envoyer la taille de ma chaine avant d'envoyer la chaine afin de lire à chaque fois le bon nombre d'octets sur le flux, mais je ne recevais pas toutes les commandes.

Pourriez vous me conseiller sur la méthode la plus adaptée pour envoyer des chaines de caractères le plus vite possible et surtout être sur de les lires intégralement?

Merci.

2 réponses

cs_Scooper Messages postés 71 Date d'inscription jeudi 2 octobre 2003 Statut Membre Dernière intervention 12 septembre 2013
4 déc. 2007 à 12:55
Bonjour,


Le mieux pour ton problème, je pense, serait d'ajouter un tag de fin du coté du client à chaque fois que tu envoi et sur le serveur que tu boucle en lecture et que tu ajoute ce que tu recoit à un buffer tant que tu n'a pas le message de fin :
Exemple en c++ d'un de mes codes existants :

//Receive data until a transmissionend tag
  do
  {
   sock.SetTimeOut(5000);
   iReaden = inetSocket.Receive(&pBuffer[iReceived],MAX_INPUT_BUFFER_LENGTH);
   sock.KillTimeOut();
   if(iReaden <= 0)
   {
    LOGFUNC("MakeInetOperations",LOG_DEBUG,"[%X] No data readen break the loop",AfxGetThread()->m_nThreadID,iReceived);
    break;
   }
   iReceived += iReaden;
  }while(CString(pBuffer).Find("#TRANSMISSIONEND#") == -1);

avec cette methode tu es sur de lire ce que le client envoi et tu coupe tes paquets comme tu veux.
3
marcus_lambert Messages postés 5 Date d'inscription jeudi 3 novembre 2005 Statut Membre Dernière intervention 4 décembre 2007
4 déc. 2007 à 17:58
Oui j'avais pensé à cette solution ainsi qu'à faire du bourrage dans mes trames.
Cette deuxième option est même plus simple à réaliser.

Comme  à priori il n'existe pas de méthode toute faite, je vais tester les deux.

Merci pour ton aide.
0
Rejoignez-nous