Fonction "client" pour mon projet
2 participants
Page 1 sur 1
Fonction "client" pour mon projet
Bonjour,
Voici la fonction "client" pris sur le site d'Emmanuel dans la partie réseau. Je l'ai modifiée afin de pouvoir concaténer les données reçues sur la socket jusqu'à qu'un bloc de 3 caractères soient transmis pour fermer la connexion. J'alloue donc la mémoire dynamiquement et puis je supprime les entêtes HTTP qui ne me servent pas. J'avoue que j'ai du mal avec les unsigned char et les char car pour la variable data c'est un pointeur sur unsigned char mais dès que j'utilise des fonctions du style strstr, elle veut des (const) chars donc je suis obligé de caster le premier paramètre ainsi que le retour de cette même fonction, est ce la bonne façon de faire ?
L'allocation mémoire est elle bien gérée ?
Toutes les critiques sont le bien venues...
Voici ma fonction
Merci pour vos réponses...
Voici la fonction "client" pris sur le site d'Emmanuel dans la partie réseau. Je l'ai modifiée afin de pouvoir concaténer les données reçues sur la socket jusqu'à qu'un bloc de 3 caractères soient transmis pour fermer la connexion. J'alloue donc la mémoire dynamiquement et puis je supprime les entêtes HTTP qui ne me servent pas. J'avoue que j'ai du mal avec les unsigned char et les char car pour la variable data c'est un pointeur sur unsigned char mais dès que j'utilise des fonctions du style strstr, elle veut des (const) chars donc je suis obligé de caster le premier paramètre ainsi que le retour de cette même fonction, est ce la bonne façon de faire ?
L'allocation mémoire est elle bien gérée ?
Toutes les critiques sont le bien venues...
Voici ma fonction
- Code:
// fonction thread client
static void *client (void *p_data)
{
struct cli *p_cli = p_data;
if (p_cli != NULL)
{
int end = 0;
unsigned char *data = NULL;
char *debut = NULL;
size_t len = 0;
do
{
data = realloc(data, (BUF_SIZE + len));
if(data != NULL)
{
// attente de donnees
int sock_ret = recv (p_cli->sock, (data + len), (BUF_SIZE - 1), 0);
if (sock_ret != SOCKET_ERROR)
{
if (sock_ret > 0)
{
len += sock_ret;
data[len] = 0;
// On recherche la fin de transmission
char *fin = strstr((const char*)data, ".\r\n\r\n");
if(fin != NULL)
{
*fin = 0;
// On recherche le debut des donnees
debut = strstr((const char*)data, "\r\n\r\n");
if(debut != NULL)
{
debut += 4;
printf("data : '%s'\n", debut);
}
else
{
puts("Marquant de debut de donnees non trouve ???");
}
end = 1;
}
}
else
{
puts ("client is disconnected");
end = 1;
}
}
else
{
perror ("socket.recv");
p_cli->err = 1;
end = 1;
}
}
else
{
perror("malloc");
p_cli->err = 1;
end = 1;
}
}
while (!end);
// QSL
if(debut != NULL)
send (p_cli->sock, debut, strlen(debut), 0);
else
send (p_cli->sock, "Erreur", strlen("Erreur"), 0);
shutdown (p_cli->sock, 2);
printf ("closing client socket %d...\n", p_cli->sock);
closesocket (p_cli->sock), p_cli->sock = INVALID_SOCKET;
// Liberation de la memoire
free (p_cli), p_cli = NULL;
free(data);
}
return NULL;
}
Merci pour vos réponses...
Re: Fonction "client" pour mon projet
Je conseille de séparer la réception du traitement de la chaine reçue, ce sera plus clair.Matt... a écrit:Voici la fonction "client" pris sur le site d'Emmanuel dans la partie réseau. Je l'ai modifiée afin de pouvoir concaténer les données reçues sur la socket jusqu'à qu'un bloc de 3 caractères soient transmis pour fermer la connexion. J'alloue donc la mémoire dynamiquement et puis je supprime les entêtes HTTP qui ne me servent pas. J'avoue que j'ai du mal avec les unsigned char et les char car pour la variable data c'est un pointeur sur unsigned char mais dès que j'utilise des fonctions du style strstr, elle veut des (const) chars donc je suis obligé de caster le premier paramètre ainsi que le retour de cette même fonction, est ce la bonne façon de faire ?
L'allocation mémoire est elle bien gérée ?
Toutes les critiques sont le bien venues...
- Code:
char *buf_rec = reception(sock);
if (buf_rec != NULL)
{
traitement(buf_rec);
free (buf_rec);
}
Sujets similaires
» Soumission de bout de code pour un projet
» Tableaux Uni-dimensionels Creux ! HELP SVP!
» Projet CAN
» Tableaux Uni-dimensionels Creux ! HELP SVP!
» Projet CAN
Page 1 sur 1
Permission de ce forum:
Vous ne pouvez pas répondre aux sujets dans ce forum
|
|