2017-10-17 13 views
1

Je suis désolé si je demande quelque chose demandé auparavant.Comment m'assurer que je ne perdrai pas de données de TCP?

Je suis en train de développer un programme qui lit les données reçues via TCP et en utilisant un StreamReader, et je n'arrive tout simplement pas à trouver comment m'assurer qu'aucune donnée ne sera manquée. Est-il possible de créer un tampon intermédiaire à lire à partir de là ou quelque chose comme ça?

Voici les méthodes que j'ai créés pour recevoir les données et l'écrire dans une zone de texte:

public static void Connect(string IP, string port)   
{ 
    try 
    { 
     client = new TcpClient(); 
     IPEndPoint IP_End = new IPEndPoint(IPAddress.Parse(IP), int.Parse(port)); 
     client.Connect(IP_End); 
     if (client.Connected) 
     { 
      connected = "Connected to Exemys!" + "\r\n"; 
      STR = new StreamReader(client.GetStream()); 
      bgWorker = true; 
     } 
    } 
    catch (Exception x) 
    { 
     MessageBox.Show(x.Message.ToString()); 
    } 
} 

-

public static void MessageReceiving(TextBox textBox) 
{ 
    try 
    { 
     string values =Conection.STR.ReadLine(); 
     textBox.Invoke(new MethodInvoker(delegate() { textBox.AppendText("Exemys : " + values.Substring(2) + Environment.NewLine); })); 
     try 
     { 
      string messagetype = values.Substring(5, 1); 
      string ID = values.Substring(3, 2); 
      string checksum = values.Substring(values.Length - 2, 2); 
      if (checksum == CalcularChecksum(values.Substring(3, values.Length - 5))) 
      { 
       if (messagetype == "N") 
       { 
        if (ID == "01") 
        { 
         ID1 = values.Substring(3, 2); 
         messagetype1 = values.Substring(5, 1); 
         capacity1 = values.Substring(6, 1); 
         pressure1 = values.Split(',')[1]; 
         sequencetime1 = values.Split(',')[2]; 
         runstatus1 = values.Split(',')[3]; 
         mode1 = values.Split(',')[4].Substring(0, 1); 
         checksum1 = CalcularChecksum(values.Substring(3, values.Length - 5)); 
        } 
        if (ID == "02") 
        { 
         ID2 = values.Substring(3, 2); 
         messagetype2 = values.Substring(5, 1); 
         capacity2 = values.Substring(6, 1); 
         pressure2 = values.Split(',')[1]; 
         sequencetime2 = values.Split(',')[2]; 
         runstatus2 = values.Split(',')[3]; 
         mode2 = values.Split(',')[4].Substring(0, 1); 
         checksum2 = CalcularChecksum(values.Substring(3, values.Length - 5)); 
        } 
       } 
      } 

     } 
     catch(Exception x) 
     { 
      MessageBox.Show(x.Message.ToString()); 
     } 
    } 
    catch (Exception) 
    { 
     MessageBox.Show("Client disconnected."); 
    } 
} 

Edit: ce que je suis en train de demander est de savoir comment toujours traiter toutes les données avant de continuer à recevoir? Ce serait la question.

+0

Ajouter des octets de contrôle. Par exemple. 2 octets croissant nombre sur tous les 32/64 octets. S'ils ne sont pas là - il manque quelque chose. – i486

Répondre

1

Un flux TCP est un flux d'octets qui se termine lorsque le socket est fermé par vous ou l'homologue distant ou se rompt à cause de problèmes de réseau. Pour obtenir tout ce qui se trouve dans le flux, vous devez appeler la méthode StreamReader.ReadLine à l'intérieur d'une boucle dans un tampon jusqu'à ce qu'une condition d'arrêt s'applique.

... 
try 
{ 
    while(true) 
    { 
     ... 
     input = STR.ReadLine(); 
     if (input == <some stop condition>) 
      break; 
     ... 
    } 
} 
... 

Ceci est un exemple très simplifié. La lecture TCP avec une gestion partielle de la mémoire tampon peut être une bête complexe, donc je recommande d'utiliser une bibliothèque ou un framework si vous faites plus qu'un projet hobby.

0

Merci pour la réponse, mais après avoir cherché, j'ai trouvé ce que je cherchais. Je voulais stocker ces messages (données) qui entraient pour m'assurer que je ne les perdrais pas (pour une raison quelconque, plus précisément que le processus de réception serait plus rapide que l'opération de traitement des messages), j'ai donc utilisé Queue pour cela .

public static void RecepcionMensajes(TextBox textBox) 
    { 
     if (client.Connected == true) 
     { 
      try 
      { 
       string fifo = Conexion.STR.ReadLine(); 
       Queue mensajes = new Queue(); 
       //Aquí se ponen en cola los mensajes que van llegando, utilizando el sistema FIFO. 
       mensajes.Enqueue(fifo); 
       string values = mensajes.Dequeue().ToString(); 
       textBox.Invoke(new MethodInvoker(delegate() { textBox.AppendText("Exemys : " + values.Substring(2) + Environment.NewLine); }));