Bien programmer en langage C
Vous souhaitez réagir à ce message ? Créez un compte en quelques clics ou connectez-vous pour continuer.
Le Deal du moment : -15%
(Adhérents) LEGO® Icons 10318 Le Concorde
Voir le deal
169.99 €

Fonction "client" pour mon projet

2 participants

Aller en bas

Fonction "client" pour mon projet Empty Fonction "client" pour mon projet

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

http://mirabon.free.fr

Revenir en haut Aller en bas

Fonction "client" pour mon projet Empty Re: Fonction "client" pour mon projet

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

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