Fonction "client" pour mon projet

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

Fonction "client" pour mon projet

Message  Matt... le Jeu 19 Mar 2009 - 11:57

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

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

Matt...

Messages : 6
Date d'inscription : 16/03/2009

Voir le profil de l'utilisateur http://mirabon.free.fr

Revenir en haut Aller en bas

Re: Fonction "client" pour mon projet

Message  -ed- le Ven 20 Mar 2009 - 20:34

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...
Je conseille de séparer la réception du traitement de la chaine reçue, ce sera plus clair.
Code:

char *buf_rec = reception(sock);
if (buf_rec != NULL)
{
  traitement(buf_rec);
  free (buf_rec);
}

_________________
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

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