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

Fonctions de transmition et de reception de blocks de données - C - Programmation

Marsh Posté le 31-03-2009 à 13:54:50    

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
Reply

Marsh Posté le 31-03-2009 à 13:54:50   

Reply

Marsh Posté le 31-03-2009 à 21:45:21    

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

Reply

Marsh Posté le 31-03-2009 à 23:14:50    

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

Reply

Marsh Posté le 01-04-2009 à 00:12:44    

xilebo a écrit :


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


strtol() plutôt non ?

Reply

Marsh Posté le 01-04-2009 à 16:04:16    

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
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed