IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement Discussion :

interpreter un reponse http de apache avec les langages C/C++


Sujet :

Développement

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 29
    Points
    29
    Par défaut interpreter un reponse http de apache avec les langages C/C++
    Bonjour,


    Je cherche, à partir d'un programme client écrit en C, à appeler une url php pour que s'exécute sur le serveur des opérations diverses et variées (qui ne posent pas de problèmes).

    Bon j'ai réussi après des heures de galère à envoyer une requête plus ou moins correcte à apache et de faire en sorte qu'il réponde aussi.

    Donc le script php que j'appelle à partir de mon programme C s'exécute parfaitement, jusque là tout va bien.

    Mais la j'ai deux petits hic.
    1)
    Apache me renvoie un réponse en je ne sais quel chinois que je n'arrive pas à interpréter
    2)
    mon programme envoie plein de requêtes à la suite mais seule la première est traitée par apache (je vérifie le log access en même temps ).

    Voici pour mon code C (dsl il est très sale c'est un test rapide) :
    (je l'ai changé pour une version plus propre )

    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
     
     
    /*
    Principe :
     
    Serveur scrutant des fichiers txt afin d'appeller une URL PHP
    par le protocole HTTP, le script PHP s'occupera d'éffectuer l'insertion des données.
     
     
     
     
    */
     
    /*
     
                                        MAIN.CCP
                                        fonction principale
     
    */
     
     
    /* LIBRAIRIES SOCKET  */
     
    //Si nous sommes sous Windows
    #if defined (WIN32)
     
    #include <winsock2.h>
    #include <windows.h>
     
    // Sinon, si nous sommes sous Linux
    #elif defined (linux)
     
    #include <sys/types.h>
    #include <sys/socket.h>
    #include <netinet/in.h>
    #include <arpa/inet.h>
    #include <unistd.h>
     
    // Define et variables nécéssaires en fonction de OS
    #define INVALID_SOCKET -1
    #define SOCKET_ERROR -1
    #define closesocket(s) close (s)
     
    typedef int SOCKET;
    typedef struct sockaddr_in SOCKADDR_IN;
    typedef struct sockaddr SOCKADDR;
     
    #endif
     
    // On inclut les fichiers standards
    #include <stdio.h>
    #include <stdlib.h>
     
    #include "http.h"
    #include "const.h"
    #include "log.h"
     
    int main(int argc, char *argv[])
    {
     
        write_log_service("Ouverture du service");
     
        // Si la plateforme est Windows
        #if defined (WIN32)
            WSADATA WSAData;
            WSAStartup(MAKEWORD(2,0), &WSAData);
        #endif
     
     
     
        /*  VARIABLES    */
        SOCKET sock;                    /* Socket de connexion */
        SOCKADDR_IN sin;                /* Structure configuration socket */
     
        char envoi [200] ={};           /* Requete à envoyer : appel de la page PHP de traitement */
        formatter_requete(envoi,HOST,GET,PAGE_PHP); /* ATTENTION!!! envoi est un pointeur  */
     
        char buffer [1000] = {};        /* Buffer de récupération de la réponse http */
     
     
     
        int i = 1;                      /* compteur : nombre de requetes envoyées */
        int nb_char_sent = 0 ;          /* compteur : nombre de caractères envoyés */
        int nb_char_received = 0 ;          /* compteur : nombre de caractères reçus */
        int is_connected = 0 ;          /* Check si client connecté  */
     
        /* Initialisation socket */
        sock = socket(AF_INET, SOCK_STREAM, 0);
     
        /* Configuration de la connexion */
            sin.sin_addr.s_addr = inet_addr("127.0.0.1");   /* Host */
            sin.sin_family = AF_INET;                       /* Connexion TCP/IP */
            sin.sin_port = htons(80);                       /* PORT 80 */
     
        /* Connexion : 0 si connecté */
            write_log_service("Connexion au serveur ...");
            is_connected = connexion(sock,sin);
     
     
            if (is_connected == 0)                          /* Si connecté */
            {
     
                while (1)                                   /* Boucle service  */
                {
     
                    write_log_service("Envoi requete au serveur - Requete : ");     /* Ecriture au journal  */
                    write_log_service(envoi);
     
                    nb_char_sent = envoyer (sock,envoi );                           /* Envoi de la requete et récupération nombre octets envoyés  */
     
                    if (nb_char_sent > 0)                                           /* Si l'envoi est effectué   */
                    {
                        write_log_service("Requete envoyee");                       /* Ecriture au journal  */
                    }
                    else                                                            /* Sinon  */
                    {
                        write_log_error("Echec envoi de la requete : ");            /* Ecriture au journal  */
                        write_log_error(envoi);
                    }
     
                    write_log_service("Attente de la réponse ");                    /* Ecriture au journal  */
     
     
                    //nb_char_received = attente_reponse( sock, buffer);              /* Attente de la réponse et récupération nombre octets reçus  */
                    nb_char_received = attente_reponse2(sock,buffer, sin);
     
                    if (nb_char_received > 0)                                       /* Si réception d'une réponse  */
                    {
                        write_log_service("Reponse reçue : ");                      /* Ecriture au journal  */
                        write_log_service(buffer);
                    }
                    else                                                            /* Sinon   */
                    {
                        write_log_service("Pas de réponse ...");                    /* Ecriture au journal  */
                        write_log_error("Aucune réponse reçue ");
                        // refaire ????
                    }
     
     
     
                    Sleep(1000);                                                    /* Mise en attente   */
                    i++;                                                            /* Comptage du nombre de requetes envoyées  */
                }
     
     
     
            }
     
     
     
     
            /* On ferme la socket précédemment ouverte */
            closesocket(sock);
     
     
     
        // Si la plateforme est Windows
        #if defined (WIN32)
            WSACleanup();
        #endif
     
        write_log_service("Fermeture du service");
        return EXIT_SUCCESS;
    }

    voila en espérant que quelqu'un pourra m'aider , merci d'avance pour vos réponses

  2. #2
    Membre expérimenté
    Avatar de granquet
    Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    1 201
    Détails du profil
    Informations personnelles :
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Octobre 2005
    Messages : 1 201
    Points : 1 421
    Points
    1 421
    Par défaut
    pour apprendre le 'chinois' HTTP: http://www.faqs.org/rfcs/rfc2616.html

    sinon tu peux t'en passer et utiliser la libcurl (qui parle le chinois HTTP couramment)
    click my www
    ............|___
    ...................\
    .................._|_
    ..................\ /
    ..................."

  3. #3
    Nouveau membre du Club
    Inscrit en
    Juin 2008
    Messages
    39
    Détails du profil
    Informations forums :
    Inscription : Juin 2008
    Messages : 39
    Points : 29
    Points
    29
    Par défaut
    Merci beaucoup pour cette réponse .

    En fait entre temps j'ai réussi à régler mon problème.

    1er problème :


    Je connais le Http, ce que j'ai appelé chinois était 4 caractères envoyés en hexa juste avant la réponse qui en décimal donnent : 120 1 61 0 ... La j'avoue que je ne sais pas ce que c'est ...
    En fait je ne recevais pas la totalité de la réponse (pas d'entête de page et la page html elle même) .
    Pour palier à ça j'ai déjà bouclé sur la fonction de réception recfromv() et puis j'ai changé cette dernière pour recv().

    2eme problème :


    Seul ma première requête était traitée par apache, j'ai donc corrigé cela en ouvrant une nouvelle socket à chaque requête , en effet j'avais une erreur 10 053 sur ma socket après les premiers échanges, cette erreur correspond à une fermeture de la connexion par le serveur, je pense que cela vient du fait que le protocole http soit un mode de communication non connecté...


    Voila donc mon code corrigé (pour une requête http) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    
    /*
    Fonction effectuant un dialogue http
    La socket doit être nouvelle à chaque requete
    
    
    Retourne :
    
    0 si ok
    -1 si pas de connexion
    -2 si echec de l'envoi de la requete
    -3 si pas de réponse du serveur
    -4 si réponse incorrecte
    
    */
    int dialogue ()
    {
    
        // Si la plateforme est Windows
        #if defined (WIN32)
            WSADATA WSAData;
            WSAStartup(MAKEWORD(2,0), &WSAData);
        #endif
    
        /*  VARIABLES    */
        SOCKET sock;                                                         /* Socket de connexion */
        SOCKADDR_IN sin;                                                     /* Structure configuration socket */
    
        char envoi [128] ="";                                                /* Requete à envoyer : appel de la page PHP de traitement */
        formatter_requete(envoi,HOST,GET,PAGE_PHP);                          /* ATTENTION!!! envoi est un pointeur  */
    
        char buffer [1024] = "";                                             /* Buffer de récupération de la réponse http */
        char response [1024] ="" ;                                           /* Chaine de stockage de réponse http  */
    
    
        int nb_char_sent = 0 ;                                               /* compteur : nombre de caractères envoyés */
        int nb_char_received = 0 ;                                           /* compteur : nombre de caractères reçus */
        int is_connected = 0 ;                                               /* Check si client connecté  */
        int returned_value = 0;                                              /* Code à retourner */
        /* Initialisation socket */
        sock = socket(AF_INET, SOCK_STREAM, 0);
    
        /* Configuration de la connexion */
        sin.sin_addr.s_addr = inet_addr("127.0.0.1");                        /* Host */
        sin.sin_family = AF_INET;                                            /* Connexion TCP/IP */
        sin.sin_port = htons(80);
    
        /* Connexion : 0 si connecté */
        write_log_service("Connexion au serveur ...");
        is_connected = connexion(sock,sin);
    
    
        /* DEBUT DU DIALOGUE   */
    
    
        if (is_connected == 0)                                              /* Si connecté */
        {
            write_log_service("Envoi requete au serveur - Requete : ");     /* Ecriture au journal  */
            write_log_service(envoi);
    
            nb_char_sent = envoyer (sock,envoi );                           /* Envoi de la requete et récupération nombre octets envoyés  */
    
            if (nb_char_sent > 0)                                           /* Si l'envoi est effectué   */
            {
                write_log_service("Requete envoyee");                       /* Ecriture au journal  */
    
                write_log_service("Attente de la réponse ");                /* Ecriture au journal  */
    
    
                /* Attente de la réponse et récupération nombre octets reçus, boucle stoppée si trop de caractères reçus  */
                while (recv(sock,buffer, 1024, 0) > 0 && nb_char_received <= MAX_ATTENTE_REPONSE)
                {
                    strcat(response, buffer);
                    nb_char_received++;                                     /* on compte le nombre de fois qu'on reçoit un message */
                }
    
    
    
                if (nb_char_received > 0)                                       /* Si réception d'une réponse  */
                {
                    write_log_service("Reponse reçue : ");                      /* Ecriture au journal  */
                    write_log_service(response);
    
                    write_log_service("Analyse de la réponse : ");
    
                    if (analyse_reponse(response))                              /* Analyse de la réponse http, cherche 200 OK */
                    {
                        write_log_service("Analyse OK");
                    }
                    else                                                        /* Si echec de l'analyse  */
                    {
                        write_log_service("Erreur analyse");
                        write_log_error("Analyse échouée réponse http != 200 OK");
                        returned_value = -4;
                    }
                }
                else                                                            /* Si pas de réponse   */
                {
                    write_log_service("Pas de réponse ...");                    /* Ecriture au journal  */
                    write_log_error("Aucune réponse reçue ");
                    // refaire ????
                    returned_value = -3;
                }
            }
            else                                                            /* Si pas d'envoi   */
            {
                write_log_service("Echec de l'envoi de la requete");
                write_log_error("Echec envoi de la requete : ");            /* Ecriture au journal  */
                write_log_error(envoi);
                returned_value = -2;
            }
    
            returned_value = 0;
        }
        else                                                                /* Si non connecté fermeture socket retourne message erreur */
        {
            /* Ecriture dans le journal déjà faite par connexion ... */
            returned_value = -1;
    
           
        }
    
        // Si la plateforme est Windows
        #if defined (WIN32)
        WSACleanup();
        #endif
        // fermeture socket
        closesocket(sock);
    
        return returned_value;
    }

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 16/12/2013, 06h00
  2. Réponses: 0
    Dernier message: 22/05/2011, 19h58
  3. Interpreter une reponse http
    Par Chtouk dans le forum C
    Réponses: 5
    Dernier message: 16/05/2007, 23h16
  4. Réponses: 3
    Dernier message: 12/02/2006, 05h51
  5. [Apache et RedHat] Problème avec les .htaccess
    Par Selpoivre dans le forum Apache
    Réponses: 15
    Dernier message: 01/04/2004, 14h24

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo