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

 C Discussion :

Comment récupérer la valeur d'une page WEB ?


Sujet :

C

  1. #21
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Tu n'as pas transformé l'adresse humaine en adresse IP avec la fonction gethostbyname visiblement, ça doit venir de ça.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
            const char *hostname = "www.developpez.com";
            hostinfo = gethostbyname(hostname);
            sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr;
    en fait ça ne sert à rien de faire la variable buffer
    (...)
    les données seront renvoyé, dans une variable (tableau) ?
    Tu as toi-même exclu la réponse à ta question

  2. #22
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    Par contre je ne sais pas me servir de la fonction GET en C
    Et comment reprendre les données de la page avec le requête GET ?
    Merci.

  3. #23
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    J'ai codé un programme similaire au tien depuis que tu as ouvert le sujet, j'ai essayé de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const char *message = "GET /actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/ HTTP/1.0\n\n";
     
        if( send(*psock, message, (int)strlen(message)+1, 0) < 0)
        {
            printf("Erreur lors du send : %d", errno);
            exit(errno);
        }
    Après m'être connecté à http://www.developpez.com, mais les résultats ne sont pas géniaux

    Sur le port 80, j'obtiens :
    HTTP/1.1 302 Found

    Date: Wed, 04 Jul 2012 09:48:08 GMT

    Server: Apache/2.2.22 (Unix) PHP/5.3.14

    Location: http://www.developpez.com/

    Vary: Accept-Encoding

    Content-Length: 210

    Connection: close

    Content-Type: text/html; charset=iso-8859-1



    <!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML 2.0//EN">
    <html><head>
    <title>302 Found</title>
    </head><body>
    <h1>Found</h1>
    <p>The document has moved <a href="http://www.developpez.com/">here</a>.</p>
    </body></html>
    Sur le port 21 :
    220 87-98-130-52.ovh.net NcFTPd Server (licensed copy) ready.

  4. #24
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    Peux-tu afficher ton code en entier je ne comprend pas la condition...

  5. #25
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    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
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <stddef.h>     /* for size_t */
    #include <sys/types.h>
    #include <errno.h>
    #include <winsock2.h>
     
    #define PORT 80
     
    int
    demarrer_sockets_windows(void)
    {
        int err = 0;
        WSADATA wsaData;
        WORD wVersionRequested = MAKEWORD(2, 2); // WORD et MAKEWORD sont definis dans windef.h
     
        err = WSAStartup(wVersionRequested, &wsaData);
     
        if (err != 0)
        {
            printf("La fonction WSAStartup a echoue.\n");
            return err;
        }
        else if(LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2)
        {
            printf("Probleme de version des sockets Winsock. "
                   "Version demandee : 2.2 ; version obtenue %d.%d\n",
                    LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion));
            return 1;
        }
        else
        {
            printf("WSAStarup OK avec Winsock en version 2.2.\n");
            return 0;
        }
    }
     
    void
    eteindre_sockets_windows(void)
    {
        // Dechargement de la DLL socket windows
        if( WSACleanup() == SOCKET_ERROR)
            printf("WSACleanup KO, mais on ferme quand meme.\n");
    }
     
    SOCKET*
    connexion_a(const char *hostname)
    {
        SOCKET *psock = NULL;
        struct hostent *hostinfo = NULL;
        SOCKADDR_IN sin;
        memset( &sin, 0, sizeof(sin)); // mettre tous les champs a 0
     
        // Creation du socket
        if( (psock = malloc(sizeof(SOCKET)) ) == NULL )
        {
            printf("Erreur d'allocation memoire pour le socket.\n"
                   "Errno : %d = %s", errno, strerror(errno));
            return NULL;
        }
     
        if( (*psock = socket(AF_INET, SOCK_STREAM, 0)) == INVALID_SOCKET )
        {
            printf("Creation impossible du socket.\n");
            return NULL;
        }
     
        // Recuperation des informations sur le serveur (conversion URL -> IP)
        if( (hostinfo = gethostbyname(hostname))== NULL )
        {
            printf ("Erreur : l'hote %s n'est pas reconnu.\n", hostname);
            return NULL;
        }
     
     
        // Connexion du socket sur la structure adrese
        sin.sin_addr = *(IN_ADDR *) hostinfo->h_addr; /* l'adresse se trouve dans le champ h_addr de la structure hostinfo */
        sin.sin_port = htons(PORT); /* on utilise htons pour le port */
        sin.sin_family = AF_INET;
     
        if(connect(*psock,(SOCKADDR *) &sin, sizeof(SOCKADDR)) == SOCKET_ERROR)
        {
            perror("connect()");
            exit(errno);
        }
     
        printf("Connexion reussie a %s.\n", hostname);
        return psock;
    }
     
    int main(int argc, char *argv[])
    {
        argv=NULL;
        argc=0;
     
        SOCKET *psock = NULL;
        const char *hote = "http://www.developpez.com";
     
        // Pour commencer
        if( demarrer_sockets_windows() != 0)
        {
            puts("Impossible de demarrer la bibliotheque de sockets.\n");
            return EXIT_FAILURE;
        }
     
        // Connexion
        if( (psock = connexion_a(hote)) == NULL)
        {
            puts("Impossible de se connecter a l'hote.\n");
            return EXIT_FAILURE;
        }
     
        // Recuperation de la page
        const char *message = "GET /actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/ HTTP/1.0\n\n";
     
        if( send(*psock, message, (int)strlen(message)+1, 0) < 0)
        {
            printf("Erreur lors du send : %d", errno);
            exit(errno);
        }
     
        char buffer[10240];
        int n = 0;
     
        if((n = recv(*psock, buffer, sizeof buffer - 1, 0)) < 0)
        {
            perror("recv()");
            exit(errno);
        }
        else
        {
            printf("Nb caracteres recu dans le buffer : %d.\n", n);
     
            FILE *fichier = fopen("page.txt", "w");
     
            if(fichier == NULL)
            {
                perror("Impossible d'ouvrir le fichier");
                exit(errno);
            }
            size_t nb = fwrite(buffer, 1, 1024, fichier);
            printf("Nb caracteres ecrits dans le fichier : %d.\n", nb);
        }
     
     
     
        // Pour finir
        eteindre_sockets_windows();
        return 0;
    }

  6. #26
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 504
    Par défaut
    Citation Envoyé par jurams Voir le message
    même en l'enlevant j'ai toujours la même erreur, peut-être qu'il faut que je donne l'adresse IP directement du site et non pas sous forme de caratères.
    En effet, inet_addr() ne fait que transformer une adresse écrite en notation décimale pointée en valeur numérique dans l'ordre du réseau. Elle ne fait pas appel au D.N.S. J'étais passé à côté de ça.

    Edit : J'ai mis l'adresse IP à la place et ça fonctionne. Pour l'instant ça donne rien, "<null>" à la fin de mon programme.
    C'est normal : lorsque tu te connectes à un serveur web, c'est toi qui a la parole en premier. Le serveur restera muet jusqu'à ce que tu lui demandes quelque chose. Si tu ne le fais pas, il finira par refermer la connexion au bout d'un délai de grâce (timeout).

    En fait ça ne sert à rien de faire la variable buffer, je ne veut pas surveiller le serveur je veux juste afficher une page, c'est la que je doit dois faire la requête GET non ? Par contre je n'ai pas compris comment se servir de cette requête, ou les données seront renvoyé, dans une variable (tableau) ? Fichier ?
    Merci
    Relis mon commentaire numéro 7 ! Tout est écrit dedans. Il est nécessaire que tu comprennes comment cela fonctionne, sinon ça ne sert à rien d'écrire un programme d'exercice !

    Lorsque tu ouvres une connexion réseau TCP vers un serveur à travers un socket, tu établis une liaison bidirectionnelle. Tout ce que tu écris dans ton socket sera envoyé au serveur et tout ce que tu y liras te sera en fait envoyé par le même serveur. En direct.

    Donc, tu vas lire le contenu avec read() comme tu le ferais sur un fichier ordinaire, et puis tu stockes ces informations soit en mémoire, consécutivement, soit directement dans un autre fichier. C'est à toi de voir.

    Citation Envoyé par jurams Voir le message
    Par contre je ne sais pas me servir de la fonction GET en C
    Et comment reprendre les données de la page avec le requête GET ?
    Merci.
    Ce n'est pas une fonction C ! C'est ce que je t'expliquais plus haut.

    Tu commences par dialoguer avec le système d'exploitation en utilisant les fonctions C pour établir une connexion, en utilisant les sockets. Lorsque la connexion est établie, il faut que tu dialogues avec le serveur pour lui demander ce que tu veux faire et ça, ça t'impose de connaître son langage.

    HTTP est un protocole texte. Ça signifie que tu peux saisir des commandes en clair, éventuellement à la main. D'autres infrastructures, comme les serveurs SQL, utilisent un protocole purement binaire et s'exploitent à travers l'API d'une bibliothèque (donc en appelant des fonctions C) qui fait tout ce travail pour toi. Elles existent également pour HTTP (ex: libCurl) mais ce n'est pas l'objet de l'exercice, ici.

    Citation Envoyé par Bktero Voir le message
    J'ai codé un programme similaire au tien depuis que tu as ouvert le sujet, j'ai essayé de faire :

    Sur le port 80, j'obtiens :
    Je ne sais pas ton message est une vraie question ou une manière de mettre le PO sur la voie mais, dans le doute et pour le PO, il s'agit d'une redirection. Autrement dit, le serveur répond que la page existe mais à un autre endroit. Il faut donc refaire une requête GET à l'adresse indiquée pour obtenir la page, sauf si on se fait rediriger à nouveau.

    En l'occurrence, c'est un poil plus grave car la redirection te renvoie sur la page d'accueil du site, probablement parce que la page en question n'existe plus.

  7. #27
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Je ne sais pas ton message est une vraie question ou une manière de mettre le PO sur la voie mais, dans le doute et pour le PO, il s'agit d'une redirection. Autrement dit, le serveur répond que la page existe mais à un autre endroit. Il faut donc refaire une requête GET à l'adresse indiquée pour obtenir la page, sauf si on se fait rediriger à nouveau.

    En l'occurrence, c'est un poil plus grave car la redirection te renvoie sur la page d'accueil du site, probablement parce que la page en question n'existe plus.
    Le bout de code est pour montrer comment j'ai utilisé GET (qui n'est pas une fonction en C mais bien la commande à envoyer au serveur).
    Le reste est pour montrer que ça ne marche pas bien.... Le port 80 est le port FTP, donc je trouve logique qu'il me renvoie ailleurs pour afficher une page web. Le port 21 est celui pour HTTP, mais la commande qui me renvoyait un truc "acceptable" en terme de format sur le port 80 ne l'est plus sur ce port 21... J'y connais pas grand chose en HTTP et compagnie, faut encore que je cherche (d'ailleurs, j'ai mis mon code entier un peu plus haut, si tu veux voir).

  8. #28
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    J'ai repris le code de Bktero,
    j'ai essayé de le refaire moi même mais moi j'ai aucun caractère ^^
    Je pense que c'est une histoire de pointeurs...
    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
     
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <stddef.h>     /* for size_t */
    #include <sys/types.h>
    #include <errno.h>
    #include <winsock2.h>
     
     
     
     
    main connection()
    {
        WSADATA wsaData;
        int dur = 0;
        int i = 0;
     
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            SOCKET s;
     
            s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
            else
            {
                SOCKADDR_IN server;
     
                server.sin_family       = AF_INET;
                server.sin_addr.s_addr  = inet_addr("87.98.128.200");
                server.sin_port         = htons(80);
                memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
     
     
     
     
                if (connect(s, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)//Si la connection a échouée message d'erreur
                {
                printf("erreur");
                }
     
                else
                {
     
     
                          const char *message = "GET /actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/ HTTP/1.0\n\n";
     
                          if( send(s, message, (int)strlen(message)+1, 0) < 0)
                          {
                           printf("erreur");
     
                          }
     
                          char buffer[10240];
                          int n = 0;
     
                          if((n = recv(s, buffer, sizeof buffer - 1, 0)) < 0)
                          {
                              printf("erreur !");
                          }
                          else
                          {
                              printf("nombre de caractère dans buffer : %d",n);
                              FILE *fichier = fopen("pageWeb.txt", "w");
     
                              if(fichier == NULL)
                            {
                              perror("Impossible d'ouvrir le fichier");
                              exit(errno);
                            }
                          size_t nb = fwrite(buffer, 1, 1024, fichier);
                          printf("Nb caracteres ecrits dans le fichier : %d.\n", nb);
                          }
     
     
     
     
                    }
     
                    shutdown(s, SD_SEND);
                }
     
                closesocket(s);
            }
     
            WSACleanup();
     
      system("PAUSE");
    }
    Il n'y a pas encore de gestion d'erreurs mais je suis en train de développer une fonction.
    Merci pour ton code qui m'a bien aidé.



    Citation Envoyé par Obsidian Voir le message
    Tu commences par dialoguer avec le système d'exploitation en utilisant les fonctions C pour établir une connexion, en utilisant les sockets. Lorsque la connexion est établie, il faut que tu dialogues avec le serveur pour lui demander ce que tu veux faire et ça, ça t'impose de connaître son langage.

    J'ai enfin compris merci .

  9. #29
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 504
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Le reste est pour montrer que ça ne marche pas bien.... Le port 80 est le port FTP, donc je trouve logique qu'il me renvoie ailleurs pour afficher une page web. Le port 21 est celui pour HTTP, mais la commande qui me renvoyait un truc "acceptable" en terme de format sur le port 80 ne l'est plus sur ce port 21... J'y connais pas grand chose en HTTP et compagnie, faut encore que je cherche (d'ailleurs, j'ai mis mon code entier un peu plus haut, si tu veux voir).
    Euh, non, c'est l'inverse !

    80 pour HTTP et 21 pour FTP.

    En outre, c'est bien le serveur web (HTTP donc) qui t'a retourné une redirection. Mais ça fait bien partie de son protocole.

  10. #30
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut

    C'est beaucoup plus logique.

    Dans le GET, il faut mettre l'adresse complète, ou juste ce qu'il y après l'après utilisée pour gethostbyname. Mon cas, je me suis connecté à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.developpez.com
    Je dois faire un GET de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    /actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    http://www.developpez.com/actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/

  11. #31
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 504
    Par défaut
    Juste le premier.

    Ceci parce que le premier champ, avant le « : » (« http », donc) est justement une indication sur le protocole à utiliser. Dès lors que tu te connectes par défaut sur le port 80 et que tu envoies une requête « GET », tu parles déjà le HTTP. Ensuite, « www.developpez.com » est le nom de machine à atteindre. À partir du moment où tu as ouvert la connexion, tu as atteint la machine. Il ne reste plus qu'à lui transmettre la page à récupérer avec les paramètres éventuels, soit tout ce qui se trouve après le slash « / ».

    Par contre, tu vas être embêté parce que le serveur de Developpez utilise des name-based virtual hosts (nbvh). C'est ce qui te permet entre autres d'avoir des pages perso hébergées de la forme « pseudonyme.fournisseur.fr » plutôt que « pagesperso.fournisseur.fr/pseudonyme/ ». Tous ces noms de machines sont résolus en la même adresse IP soit parce ce sont des alias DNS explicites, soit parce que le DNS ne définit une adresse que pour le domaine entier et rien de plus précis.

    Du coup, ça ne marche que si le protocole te permet d'indiquer explicitement au serveur quel nom de domaine tu as appelé, car il ne peut absolument pas le déduire de l'adresse IP sur laquelle tu t'es connecté. Et c'est ce qui t'empêche de faire la même chose avec d'autres protocoles (comme FTP) s'ils ne sont pas prévus pour, ou d'utiliser des certificats en HTTPS sans les extensions associées (et ça, c'est très problématique) car la négociation SSL ou TLS se fait, par définition, avant que la connexion avec le serveur HTTP proprement dit soit établie.

    Problème : c'est une possibilité qui n'est apparue qu'avec HTTP/1.1, lequel protocole requiert justement que tu lui passes au moins le header « Host: » en plus de ta requête.

    Comme tu ne le fais pas, le serveur ne sait pas quel hôte virtuel tu cherches à atteindre et te renvoie donc par défaut sur la page d'accueil.

    Ça marche mieux avec :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    GET //actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/ HTTP/1.1
    Host: www.developpez.com

  12. #32
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    On m'a dit qu'il y avait un problème avec le "\n\n" dans la requète pourtant ça a bien fonctionné avec toi Bktero...

    Edit :il fallait mettre "\r\n\r\n" au lieu de "\n\n".

  13. #33
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 498
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 498
    Billets dans le blog
    1
    Par défaut
    Obsidian, quand je lis tes messages, je me demande comment c'est possible que tu cherches encore et que les gens ne se jettent pas à tes pieds (voir sous ton avatar) !

    Je ne suis clairement pas aussi fort que toi, car je n'ai toujours pas réussi à récupérer ma page, les requêtes que je lui donne ne semble être très appréciées. Elles ne sont pas comprises (il me le dit dans le html de retour) par le serveur. Ma dernière tentative avec ça n'a rien donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        const char *commande_get = 
        "GET //actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/ HTTP/1.1 "
                                   "Host: www.developpez.com\n\n";
    Un autre soucis me dérange beaucoup plus, c'est que je n'arrive pas à résoudre une autre adress que http://www.developpez.com J'ai essayé plusieurs autres URL, comme http://www.google.fr, http://www.liberation.fr et gethostbyname()échoue... L'erreur WSA est :
    WSANO_DATA
    11004

    Valid name, no data record of requested type.

    The requested name is valid and was found in the database, but it does not have the correct associated data being resolved for. The usual example for this is a host name-to-address translation attempt (using gethostbyname or WSAAsyncGetHostByName) which uses the DNS (Domain Name Server). An MX record is returned but no A record—indicating the host itself exists, but is not directly reachable.
    Mais je ne sais pas quoi en faire


    PS : message numéro [ame="http://www.youtube.com/watch?v=oggEM6lmHuY"]999[/ame] !

  14. #34
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 504
    Par défaut
    Hello,

    Citation Envoyé par Bktero Voir le message
    Obsidian, quand je lis tes messages, je me demande comment c'est possible que tu cherches encore et que les gens ne se jettent pas à tes pieds (voir sous ton avatar) !
    C'est flatteur, mais ça tient à plusieurs choses. D'abord, je n'ai pas beaucoup cherché ces derniers mois :-) Et puis certains événements familiaux m'ont occupé un peu l'esprit. Ensuite, il y a beaucoup de gens très compétents dans le monde du travail et c'est dur de s'y faire une (bonne) place, car la plupart d'entre eux sont bien sûr focalisés sur leur métier et on les voit assez peu sur les forums.

    En outre, je ne suis pas si doué que ça. La plupart du temps, il s'agit de problèmes techniques qui trouvent leur réponse dans la documentation ou qui ne demandent pas forcément d'entraînement particulier, par opposition à de gros problèmes mathématiques par exemple. C'est juste que j'y ai été souvent confronté.

    Enfin, dans le cas qui nous intéresse, il s'agit de développement web. Ça peut paraître subtil parce que nous sommes ici sur le forum C mais dans la section consacrée,
    ce sont des cas de figures très bien identifiés.

    Je ne suis clairement pas aussi fort que toi, car je n'ai toujours pas réussi à récupérer ma page, les requêtes que je lui donne ne semble être très appréciées. Elles ne sont pas comprises (il me le dit dans le html de retour) par le serveur. Ma dernière tentative avec ça n'a rien donné :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        const char *commande_get = 
        "GET //actu/45408/jQuery-2-ne-supportera-plus-les-versions-obsoletes-d-IE-la-branche-1-9-continuera-d-exister-en-parallele/ HTTP/1.1 "
                                   "Host: www.developpez.com\n\n";
    Il y a un slash en trop avant « actu » en début de ligne et il manque un retour à la ligne après « HTTP/1.1 ».

    Un autre soucis me dérange beaucoup plus, c'est que je n'arrive pas à résoudre une autre adress que http://www.developpez.com J'ai essayé plusieurs autres URL, comme http://www.google.fr, http://www.liberation.fr et gethostbyname()échoue...
    Oui. C'est la raison pour laquelle gethostbyname() est aujourd'hui dépréciée en faveur de getaddrinfo().

    Aujourd'hui, un même identifiant peut être associé à un agrégat d'informations assez compliqué. Par exemple : l'URL d'un site peut être associé à la fois à une adresse IPv4 et IPv6. Il se peut aussi que l'URL en question soit un alias qu'il faudra lui-même résoudre avant de trouver l'adresse finale de destination. Il se peut enfin qu'elle soit associée à plusieurs adresses pour des raisons de load balancing (plus rare).

    Un exemple avec Google :

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ host www.google.fr
    www.google.fr is an alias for www-cctld.l.google.com.
    www-cctld.l.google.com has address 173.194.67.94
    www-cctld.l.google.com has IPv6 address 2a00:1450:4007:803::1017

    Félicitations pour ton millième commentaire. J'en profite également pour souligner la qualité de tes propres interventions qui ne passe pas inaperçue non plus.

    Bon courage.

  15. #35
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    J'ai enfin réussis à avoir ma page html !
    Merci beaucoup à vous
    J'ai télécharger donc la page d'un site météo dans un fichier txt, ensuit je prend à un endroit précis la température, le problème c'est que une fois sur 2 ça m'écrit des caractères étranges que je ne peux écrire.
    Je vous redonne mon code totalement :

    main.c :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <stddef.h>     /* for size_t */
    #include <sys/types.h>
    #include <errno.h>
    #include <winsock2.h>
     
     
    void main()
    {
        WSADATA wsaData;
        int c = 0;
        int degres = 0;
        int caract = 54103;
     
     
     
     
     
     
     
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            SOCKET s;
     
            s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
            else
            {
                SOCKADDR_IN server;
     
                server.sin_family       = AF_INET;
                server.sin_addr.s_addr  = inet_addr("66.196.66.213");
                server.sin_port         = htons(80);
                memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
     
     
     
     
                if (connect(s, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)//Si la connection a échouée message d'erreur
                {
     
                erreurWSA();
                }
     
                else
                {
     
     
                          const char *message = "GET http://fr.meteo.yahoo.com/france/ile-de-france/paris-12727257/ HTTP/1.1\r\n\r\n";
     
                          if( send(s, message, (int)strlen(message)+1, 0) < 0)
                          {
     
                           erreurWSA();
     
                          }
     
                          char buffer[caract];
                          int n = 0;
     
                          if((n = recv(s, buffer, sizeof buffer - 1, 0)) < 0)
                          {
                              printf("%d",errno);
                              erreurWSA();
     
     
                          }
                          else
                          {
                              printf("nombre de caractère dans buffer : %d",n);
                              FILE *fichier = fopen("pageAIL.txt", "w+");
     
                              if(fichier == NULL)
                            {
                              perror("Impossible d'ouvrir le fichier");
     
                            }
                            while(c<caract)
                            {
                          fputc(buffer[c], fichier);
                          c++;
                            }
     
     
     
     
     
                          fclose(fichier);
     
                          degres = MeteoResult();
     
                          printf("\nIl fait %d degres celcus\n ", degres);
     
     
     
                        }
     
     
     
     
     
                    }
     
     
     
                    shutdown(s, SD_SEND);
                }
     
     
     
                closesocket(s);
        }
     
            WSACleanup();
     
     
    }
    WRfile.c :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <stddef.h>     /* for size_t */
    #include <sys/types.h>
    #include <errno.h>
    #include <winsock2.h>
    //ici c'est la gestion des fichiers
     
    int MeteoResult();//Cette fonction va chercher la température dans le fichier ou est stock la page WEB
     
    int MeteoResult()
    {
        FILE* fichier = NULL;
        int temperature = 0;
     
        fichier = fopen("pageAIL.txt","r");
     
        if (fichier==NULL)
        {
        printf("\nImpossible d'ouvrir le fichier, fermez le svp.");
        }
        else
        {
           fseek(fichier, 53961, SEEK_SET);//place le curseur x caractères après le début
           fseek(fichier, -4, SEEK_CUR);
     
           temperature = fgetc(fichier);
     
     
     
        }
     
        fclose(fichier);
        return temperature;
     
    }
    erreur.c :
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <stddef.h>     /* for size_t */
    #include <sys/types.h>
    #include <errno.h>
    #include <winsock2.h>
     
     
    void erreurWSA();
     
    void erreurWSA()
    {
        int erreur = -999;
        erreur = WSAGetLastError();
        fprintf(stderr, "\nLa fonction connect a echoue.\n");
     
                    if (erreur==WSAENETDOWN)
                    printf("Le sous-système réseau a échoué.");
                    else if(erreur==WSANOTINITIALISED)
                    printf("Un Wstartup doit etre fait avant !");
                    else if(erreur==WSAEADDRINUSE)
                    printf("déjà utilise");
                    else if(erreur==WSAEINTR)
                    printf("erreur WSAEINTR");
                    else if(erreur==WSAEINPROGRESS)
                    printf("erreur : WSAEINPROGRESS");
                    else if(erreur==WSAEALREADY)
                    printf("erreur : WSAEALREADY");
                    else if(erreur==WSAEADDRNOTAVAIL)
                    printf("L'adresse a distance n'est pas une adresse valide");
                    else if(erreur==WSAEAFNOSUPPORT)
                    printf("dur");
                    else if(erreur==WSAECONNREFUSED)
                    printf("dur");
                    else if(erreur==WSAEFAULT)
                    printf("dur");
                    else if(erreur==WSAEINVAL)
                    printf("dur");
                    else if(erreur==WSAEISCONN)
                    printf("dur");
                    else if(erreur==WSAENETUNREACH)
                    printf("dur");
                    else if(erreur==WSAEHOSTUNREACH)
                    printf("dur");
                    else if(erreur==WSAENOBUFS)
                    printf("dur");
                    else if(erreur==WSAENOTSOCK)
                    printf("dur");
                    else if(erreur==WSAETIMEDOUT)
                    printf("dur");
                    else if(erreur==WSAEWOULDBLOCK)
                    printf("dur");
                    else if(erreur==WSAEACCES)
                    printf("dur");
                    exit(erreur);
     
    }
    Je ne trouve pas mon erreur, je pensais que ça venait du fait que je n'avais pas vidé "fichier" avec fclose() mais non apperrement j'ai aussi changé la manière de l'ouvrir : "W+" ->supprime avant.

  16. #36
    rjl
    rjl est déconnecté
    Membre éclairé
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 83
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 301
    Par défaut
    Bonsoir,
    C'est très probablement un problème d'encodage
    Il est recommandé, aujourd'hui d'être en UTF-8 ; non leut le changer facilement en Notepad++ (5è onglet).
    Mais il y a probablement un second endroit où il faut agir (rechercher encodage).
    Il faut aussi adapter la Meta précisant le Charset à utiliser <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
    <meta http-equiv="Content-Type" content="text/html; charset=<meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> " />
    bien sûr selon les caractères utilisés, il faut parfois d'autres jeux de caractères mais, attention, par exemple l'iso-8859-15répond à beaucoup de cas mais le 8859-1 ne contient pas le symbole € !
    Bonne suite.
    @+ RJL2706

  17. #37
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    Merci pour l'aide, j'ai donc changé en UTF-8 mais ça n'a pas changé, pour la Meta je ne sais pas où la placer, faire une nouvelle requète ? Ou la placer dans la requète GET ?

  18. #38
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    Au passage quelqu'un serait pourquoi le compilateur m'annonce que je n'ai pas déclarée la variable 'n' à la fin de la boucle ?
    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
    #include <stdlib.h>
    #include <stdio.h>
    #include <string.h>
    #include <stddef.h>     /* for size_t */
    #include <sys/types.h>
    #include <errno.h>
    #include <winsock2.h>
     
     
    void main()
    {
        WSADATA wsaData;
        int c = 0;
        int degres = 0;
        int caract = 54103;
        int i = 0;
     
     
     
         do{
     
        if (WSAStartup(MAKEWORD(2, 0), &wsaData) != 0)
            fprintf(stderr, "La fonction WSAStartup a echoue.\n");
        else
        {
            SOCKET s;
     
            s = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP);
            if (s == INVALID_SOCKET)
                fprintf(stderr, "La fonction socket a echoue.\n");
            else
            {
                SOCKADDR_IN server;
     
                server.sin_family       = AF_INET;
                server.sin_addr.s_addr  = inet_addr("66.196.66.213");
                server.sin_port         = htons(80);
                memset(&server.sin_zero, '\0', sizeof(server.sin_zero));
     
     
     
     
                if (connect(s, (SOCKADDR *)&server, sizeof(server)) == SOCKET_ERROR)//Si la connection a échouée message d'erreur
                {
     
                erreurWSA();
                }
     
                else
                {
     
     
                          const char *message = "GET http://fr.meteo.yahoo.com/france/ile-de-france/paris-12727257/ HTTP/1.1\r\n\r\n";
     
                          if( send(s, message, (int)strlen(message)+1, 0) < 0)
                          {
     
                           erreurWSA();
     
                          }
     
                          char buffer[caract];
                          int n = 0;
     
                          if((n = recv(s, buffer, sizeof buffer - 1, 0)) < 0)
                          {
                              printf("%d",errno);
                              erreurWSA();
     
     
                          }
                          else
                          {
                              printf("nombre de caractère dans buffer : %d",n);
                              FILE *fichier = fopen("pageAIL.txt", "w+");
     
                              if(fichier == NULL)
                            {
                              perror("Impossible d'ouvrir le fichier");
     
                            }
                            while(c<caract)
                            {
                          fputc(buffer[c], fichier);
                          c++;
                            }
     
     
     
     
     
                          fclose(fichier);
     
                          degres = MeteoResult();
     
                          printf("\nIl fait %d degres celcus\n ", degres);
     
     
     
                        }
     
     
     
     
     
                    }
     
     
     
     
     
     
                    shutdown(s, SD_SEND);
                }
     
     
     
                closesocket(s);
        }
     
     
     
         }while(caract!=n);
            WSACleanup();
     
     
    }

  19. #39
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 504
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 504
    Par défaut
    Citation Envoyé par jurams Voir le message
    Au passage quelqu'un serait pourquoi le compilateur m'annonce que je n'ai pas déclarée la variable 'n' à la fin de la boucle ?
    Parce que c'est le cas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
         }while(caract!=n);
            WSACleanup();

    À aucun moment tu n'as défini de variable n.

    Si c'est le retour à la ligne que tu cherches à détecter, il aurait fallu écrire « '\n' ».

  20. #40
    Membre averti
    Homme Profil pro
    Lycéen
    Inscrit en
    Juin 2011
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Juin 2011
    Messages : 42
    Par défaut
    J'avais déclaré la variable dans la boucle il fallait le faire au début.
    Sinon je n'arrive toujours pas à enlever ces caractères spéciaux qui me bloque complètement je ne peux plus continuer mon programme.

Discussions similaires

  1. Comment récupérer l'affichage d'une page WEB
    Par chould dans le forum VB.NET
    Réponses: 5
    Dernier message: 18/05/2013, 00h56
  2. Récupérer des valeurs dans une page WEB
    Par megamario dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 14/09/2011, 14h05
  3. récupérer des valeurs sur une page web
    Par houwa dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 11/07/2008, 14h27
  4. Réponses: 7
    Dernier message: 14/04/2007, 17h25

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