begin process at 2008 07 20 15:49:19
1 213 305 membres
219 nouveaux aujourd'hui
14 166 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Tcpclient - taille des paquets [ Réseau & Internet / Client - Serveur ] (marcus_lambert)

Tcpclient - taille des paquets le 04/12/2007 12:12:43

marcus_lambert
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:


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
    }


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.

Re : Tcpclient - taille des paquets le 04/12/2007 12:55:33

Scooper
Réponse acceptée !

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.


Re : Tcpclient - taille des paquets le 04/12/2007 17:58:32

marcus_lambert
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.


Classé sous : client, envoyer, char, tcpclient, cbuffer

Participer à cet échange

Pub



Appels d'offres

Dessins techniques
Budget : 60€
Animation Flash - Doma...
Budget : 370€
Application flash medi...
Budget : 1 000€

CalendriCode

Juillet 2008
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

VS Express FR Gratuit !

VS Express en français et 100% gratuit !

Téléchargements

Boutique

Boutique de goodies CodeS-SourceS