Auteur de questions
Acknowledgment pour l'envoie de la prochaine socket de données

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);
}
/////////////////////////////////////////////////////////////////////- Type modifié Florin CiucaModerator mardi 28 août 2012 12:59 attente de feedback
Toutes les réponses
-
Bonsoir,
J'espère ne pas arriver en retard !!!
d'une part je pense que vous devriez revoir l'utilisation des sockets, si possible utiliser l'asynchrone.
Ensuite séparer l'aspect métier de l'envoie/réception.
Deux pourquoi n'envoyer que ACK en retour ? Perso. j'aurais utilisé le même principe que l'aller ID + 0=non reçu et 1=OK. De plus il faut ajouter un timeout (à définir soit par un calcul automatique [temps d'un transfert ou ping] soit manuellement dans un fichier de config.)pour sortir d'un thread bloquant en cas de non retour.
N'hésitez pas à revenir pour plus d'info.
Cordialement
-
Bonjour,
Merci de nous tenir au courant.
Cordialement,
Florin
Florin CIUCA, MSFT Votez! Appel à la contribution
Nous vous prions de considérer que dans le cadre de ce forum on n’offre pas de support technique et aucune garantie de la part de Microsoft ne peut être offerte.