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

Voir le sujet précédent Voir le sujet suivant Aller en bas

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

Message  senegaloruskov le Lun 30 Mar 2009 - 19:10

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 efficaces. 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:
/******** Reception *************/ 
int RecvData (SOCKET sock, char *data, int sizeof_data)
{
  int len_data, data_receved = 0, n;
  char len_data_buffer[10];

/* Recevoir la taille de data */
  if (n = recv (sock, len_data_buffer, sizeof len_data_buffer - 1, 0) == SOCKET_ERROR);
      return SOCKET_ERROR;

  len_data_buffer[n] = 0;
  len_data = atoi (len_data_buffer);

  while (data_receved < len_data)
  {
      n = recv (sock, data + data_receved, sizeof_data - data_receved, 0);
      if (n >= 0) data_receved += n;
      else  return SOCKET_ERROR;
  }

  return data_receved;
}

/******** Envoi *************/ 
int SendData (SOCKET sock, char *data)
{
  int len_data = strlen(data), data_sent = 0, n;
  char len_data_str[10];

  sprintf (len_data_str, "%d", len_data);

  if ((n = send (sock, len_data_str, strlen(len_data_str), 0)) == SOCKET_ERROR)
      return SOCKET_ERROR;

  while (data_sent < len_data)
  {
      n = send (sock, data + data_sent, len_data - data_sent, 0);
      if (n >= 0) data_sent += n;
      else  return SOCKET_ERROR;
  }
  return data_sent;
}


Dernière édition par senegaloruskov le Mar 31 Mar 2009 - 14:58, édité 3 fois (Raison : Ajout de la remarque.)

senegaloruskov

Messages : 4
Date d'inscription : 30/03/2009

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Fonctions de transmition et de reception de blocks de données.

Message  senegaloruskov le Mar 31 Mar 2009 - 14:58

personne ?

senegaloruskov

Messages : 4
Date d'inscription : 30/03/2009

Voir le profil de l'utilisateur

Revenir en haut Aller en bas

Re: Fonctions de transmition et de reception de blocks de données.

Message  -ed- le Mer 1 Avr 2009 - 3:06

senegaloruskov a écrit:personne ?
Je t'ai répondu en privé sur le Site du Zéro ...

Mes commentaires (-ed-)
Code:

/******** Reception *************/
int RecvData (SOCKET sock, char *data, int sizeof_data)
{
  int len_data, data_received = 0, n;
  char len_data_buffer[10];

/* Recevoir la taille de data */
/* -ed- Attention, il manque des () pour être clair et le code d'erreur est n <= 0 (0 signifie 'deconnexion). BUG : Il y a une ';' en trop ...
  if (n = recv (sock, len_data_buffer, sizeof len_data_buffer - 1, 0) == SOCKET_ERROR);
      return SOCKET_ERROR;
*/
  n = recv (sock, len_data_buffer, sizeof len_data_buffer - 1, 0)
  if (n <= 0)
  {
      if (n == 0)
      {
        printf ("disconnected\n");
      }
      else
      {
        printf ("error\n");
      }
      return SOCKET_ERROR;
  }
  len_data_buffer[n] = 0;

/* -ed- Attention, pas d'acquittement ? pas de séparateur ? On ne sait pas si les données reçues (taille) sont complètes ni si elle ne contiennent pas déjà des données... Problème de conception du protocole. Je recommande :

Envoi de la taille
----------------->
OK
<----------------
Envoi des données
----------------->
----------------->
...
----------------->
OK
<----------------


*/

  /* -ed- atoi() est obsolete, préférer strtol()... */
  len_data = atoi (len_data_buffer);

  /* -ed- ajoute securite : */
  if (len_data > sizeof_data)
  {
      printf("size error\n");
      return SOCKET_ERROR;
  }

  while (data_received < len_data)
  {
      n = recv (sock, data + data_received, sizeof_data - data_received, 0);
/* -ed- meme probleme
      if (n >= 0) data_received += n;
      else  return SOCKET_ERROR;
*/
      if (n > 0)
      {
        data_received += n;
      }
      else
      {
        if (n == 0)
        {
            printf ("disconnected\n");
        }
        else
        {
            printf ("error\n");
        }
        return SOCKET_ERROR;
      }
  }

  return data_received;
}

/******** Envoi *************/
int SendData (SOCKET sock, char *data)
{
/* -ed- l'usage de strlen() suppose qu'on transfert du texte. C'est bien le cas ? */
  int len_data = strlen(data), data_sent = 0, n;
  char len_data_str[10];

  sprintf (len_data_str, "%d", len_data);

  /* -ed- pas de séparateur ? C'est risqué, surtout si la trame n'est pas acquitée...
          Voir ma remarque au-dessus, sur le protocole... */

  /* -ed- même remarque sur la valeur retournée... */
  if ((n = send (sock, len_data_str, strlen(len_data_str), 0)) == SOCKET_ERROR)
      return SOCKET_ERROR;

  while (data_sent < len_data)
  {
      n = send (sock, data + data_sent, len_data - data_sent, 0);
     
/* -ed- idem ... Oui le traitement des erreurs, c'est casse pieds... */
      if (n >= 0) data_sent += n;
      else  return SOCKET_ERROR;
  }
  return data_sent;
}

_________________
C is a sharp tool !

-ed-
Admin
Admin

Messages : 289
Date d'inscription : 26/05/2008
Age : 60
Localisation : Paris 6eme arrondissement (75, France)

Voir le profil de l'utilisateur http://bien-programmer.fr

Revenir en haut Aller en bas

Re: Fonctions de transmition et de reception de blocks de données.

Message  Contenu sponsorisé Aujourd'hui à 21:20


Contenu sponsorisé


Revenir en haut Aller en bas

Voir le sujet précédent Voir le sujet suivant Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum