Fonctions de transmition et de reception de blocks de données.
2 participants
Page 1 sur 1
Fonctions de transmition et de reception de blocks de données.
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.
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
senegaloruskov- Messages : 4
Date d'inscription : 30/03/2009
Re: Fonctions de transmition et de reception de blocks de données.
Je t'ai répondu en privé sur le Site du Zéro ...senegaloruskov a écrit:personne ?
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;
}
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum