Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2529 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Fonctions de transmition et de reception de blocks de données

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonctions de transmition et de reception de blocks de données

n°1867864
tomap
Posté le 31-03-2009 à 13:54:50  profilanswer
 

Salut, je voudrai savoir si les fonctions ci-dessous que j'ai défini pour la transition (resp réception) de données sont correctes et efficases. Sinon comment les améliorer ?

 

Remarque: dans la fonction d'envoi, je commence par envoyer (en mode texte) la taille de la donnée qu'on veux envoyer puis la donnée elle même, et dans la fonction de réception je reçois avant tout, la taille de la données que je dois recevoir, puis la donnée elle même.

 

Merci.

 
Code :
  1. /******** Reception *************/
  2. int RecvData (SOCKET sock, char *data, int sizeof_data)
  3. {
  4.   int len_data, data_receved = 0, n;
  5.   char len_data_buffer[10];
  6. /* Recevoir la taille de data */
  7.   if (n = recv (sock, len_data_buffer, sizeof len_data_buffer - 1, 0) == SOCKET_ERROR);
  8.       return SOCKET_ERROR;
  9.   len_data_buffer[n] = 0;
  10.   len_data = atoi (len_data_buffer);
  11.   while (data_receved < len_data)
  12.   {
  13.       n = recv (sock, data + data_receved, sizeof_data - data_receved, 0);
  14.       if (n >= 0) data_receved += n;
  15.       else  return SOCKET_ERROR;
  16.   }
  17.   return data_receved;
  18. }
  19. /******** Envoi *************/
  20. int SendData (SOCKET sock, char *data)
  21. {
  22.   int len_data = strlen(data), data_sent = 0, n;
  23.   char len_data_str[10];
  24.   sprintf (len_data_str, "%d", len_data);
  25.   if ((n = send (sock, len_data_str, strlen(len_data_str), 0)) == SOCKET_ERROR)
  26.       return SOCKET_ERROR;
  27.   while (data_sent < len_data)
  28.   {
  29.       n = send (sock, data + data_sent, len_data - data_sent, 0);
  30.       if (n >= 0) data_sent += n;
  31.       else  return SOCKET_ERROR;
  32.   }
  33.   return data_sent;
  34. }



Message édité par tomap le 31-03-2009 à 14:11:34
mood
Publicité
Posté le 31-03-2009 à 13:54:50  profilanswer
 

n°1868014
xilebo
noone
Posté le 31-03-2009 à 21:45:21  profilanswer
 

- Rien ne te garantit que tu recevras len_data_buffer en une fois. Il faudrait donc également boucler pour recevoir la totalité des données.
- Plutot que atoi(), préfères sscanf.
- Plutot que sprintf(), préfères snprintf pour éviter les débordements de buffer. Imagine len_data = -2000000000 , pouf t'as deja 10 caractères.

n°1868033
tomap
Posté le 31-03-2009 à 23:14:50  profilanswer
 

xilebo a écrit :

- Rien ne te garantit que tu recevras len_data_buffer en une fois. Il faudrait donc également boucler pour recevoir la totalité des données.


Et comment est ce que je vais savoir quand est ce qu'il faut s'arreter de recevoir dans len_data_buffer ? Quoi qu'il en soit, je pense a envoyer la taille de la donnée sous format binaire (un long de 4 octet) plutot qu'au format text comme je l'ai fait.
 
Dans SendData, j'envoi la taille comme suite:

Code :
  1. long n, data_sent = 0, len_data_nl = htonl(strlen(data))
  2. while( data_sent < 4 )
  3. {
  4.       n = send (sock, ((char*)&len_data_nl) + data_sent, sizeof(len_data_nl) - data_sent, 0);
  5.       if ( n > 0 )  data_sent += n;  else  return SOCKET_ERROR;
  6. }
  7. ...


Et dans RecvData, je reçois la taille comme suite:

Code :
  1. long n, data_receved = 0, len_data_nl;
  2. while( data_receved < 4 )
  3. {
  4.       n = recv (sock, ((char*)&len_data_nl) + data_receved, sizeof(len_data_nl) - data_receved, 0);
  5.       if ( n > 0 )  data_receved += n;  else  return SOCKET_ERROR;
  6. }
  7. long len_data = ntohl(len_data_nl);
  8. ...


J'aimerai savoir si c'est une bonne idée

n°1868042
sligor
Posté le 01-04-2009 à 00:12:44  profilanswer
 

xilebo a écrit :


- Plutot que atoi(), préfères sscanf.


strtol() plutôt non ?

n°1868373
tomap
Posté le 01-04-2009 à 16:04:16  profilanswer
 

sligor a écrit :


strtol() plutôt non ?


Oui en effet. Mais personne n'as de commentaires sur ma méthode si dessus ?


Message édité par tomap le 01-04-2009 à 16:04:23

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Fonctions de transmition et de reception de blocks de données

 

Sujets relatifs
Contenu d'un TextArea dans paramètres fonctionsCréer un formulaire PHP qui renvoie les données en Excel
j n arrive pas à créer une connexion java vers base de données mysql[batch] rapatrier automatiquement vers un serveur central des données
recuperation des donnees à partir d'un comboImport module de fonctions
Ports série Bluetooth sur PocketPC et perte de données...Débutant - Manipulation de données d'un txt
[PHP 5] base de données mysql : commande 'UPDATE' ?classes et base de données =/
Plus de sujets relatifs à : Fonctions de transmition et de reception de blocks de données


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR