Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
-21%
Le deal à ne pas rater :
LEGO® Icons 10329 Les Plantes Miniatures, Collection Botanique
39.59 € 49.99 €
Voir le deal

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

2 participants

Aller en bas

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

Message  senegaloruskov 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

Revenir en haut Aller en bas

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

Message  senegaloruskov Mar 31 Mar 2009 - 14:58

personne ?

senegaloruskov

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

Revenir en haut Aller en bas

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

Message  -ed- 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;
}
-ed-
-ed-
Admin
Admin

Messages : 290
Date d'inscription : 26/05/2008
Age : 67
Localisation : Paris 14eme arrondissement (75, France)

http://bien-programmer.fr

Revenir en haut Aller en bas

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

Message  Contenu sponsorisé


Contenu sponsorisé


Revenir en haut Aller en bas

Revenir en haut

- Sujets similaires

 
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
Ne ratez plus aucun deal !
Abonnez-vous pour recevoir par notification une sélection des meilleurs deals chaque jour.
IgnorerAutoriser