none
Acknowledgment pour l'envoie de la prochaine socket de données RRS feed

  • Discussion générale

  • Acknowledgment pour l'envoie de la prochaine socket de données
    Bonjour!

    J'envoie une liste de commande à la partie réception, pour éviter les problèmes de perte de données j'ai pensé à un mécanisme qui ne permet d'envoyer une commande que si l'autre a été reçue(l'envoie se fait à travers des socket TCP/IP): donc à la réception d'une commande , le récepteur envoie "ACK" pour dire j'ai reçue votre commande vous pouvez désormais envoyer la deuxième, ce code marche mais l'application se coince après un certain temps, s'agit il de problèmes liés aux thread ou à autre chose, s'il vous plais aidez moi si vous avez une autre manière de faire cela j'accepte toute proposition.

    Merci beaucoup
    PS:la commande que j'envoie est formé de ID et DATA c'est pour cela que j'ai utilisé un fichier xml pour les envoyer



    //////////////////////////////////////////////////////////////////////////////
    public string SendData_ACK(Socket clientSocket, string send_data)
    {
    string[] lines = send_data.Split(new string[] { Environment.NewLine }, StringSplitOptions.RemoveEmptyEntries);
    int numLines = lines.Length;
    int i = 0;
    // bool contains = false;


    while (i < numLines)
    {

    bool contains = false;
    var values0 = lines[i].Split(':');

    int iNumbervalue0 = int.Parse(values0[0]);



    string xmlPathcan_send_Cmd1 = System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "can_send_Cmd1.xml");

    XmlTextWriter writer2 = new XmlTextWriter(xmlPathcan_send_Cmd1, System.Text.Encoding.UTF8);
    writer2.WriteStartDocument(true);
    writer2.Formatting = Formatting.Indented;
    writer2.Indentation = 2;
    writer2.WriteStartElement("CAN_Data");




    this.createNodeCANCommand1(values0[0], values0[1], writer2); :: CREATES THE xml NODE TO BE SENT


    writer2.WriteEndElement();
    writer2.WriteEndDocument();
    writer2.Close();



    // ----------------------------------------------------------------------------//
    // Parse the xml_configuration file
    //-----------------------------------------------------------------------------//

    // HERE I PARSE MY XML
    //-----------------------------------------------------------------------------//
    // Send the xml_configuration_file
    //----------------------------------------------------------------------------//
    Inputdata = output.ToString();
    if (clientSocket.Connected)
    {

    if (i == 0)
    {

    this.Send_Data(clientSocket, Inputdata);

    }
    else
    {
    while (contains == false)
    {

    string ack = this.Receive_Data_From_Transceiver(clientSocket);
    contains = ack.Contains("ACK");


    }

    this.Send_Data(clientSocket, Inputdata);

    }

    }

    i++;
    }
    return send_data;
    }
    //////////////////////////////////////////////////////////////////
    the code for receiving:

    /////////////////////////////////////////////////////////////////////////////////////////////

    public string Receive_Data_From_Transceiver(Socket Transceiver_Socket)
    {
    string Receive_Data = "";
    if (Transceiver_Socket.Connected)
    {

    int size = 0;

    try
    {
    byte[] inStream = new byte[10025];
    try
    {
    size = Transceiver_Socket.Receive(inStream);
    //Receive_Data = System.Text.Encoding.ASCII.GetString(inStream);///////////26/06/2012
    Receive_Data = System.Text.Encoding.ASCII.GetString(inStream);
    Array.Clear(inStream, 0, inStream.Length - 1);
    }
    catch (Exception Receive_Data_Exc)
    { MessageBox.Show(Receive_Data_Exc.ToString()); }

    }
    catch (Exception Receive_Data_Excp)
    {
    MessageBox.Show(Receive_Data_Excp.ToString());
    }


    }
    return (Receive_Data);
    }
    /////////////////////////////////////////////////////////////////////
    jeudi 2 août 2012 10:20

Toutes les réponses