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

Réseau C Discussion :

En C, lire une page Internet avec un URL complet


Sujet :

Réseau C

  1. #1
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 47
    Par défaut En C, lire une page Internet avec un URL complet
    Bonjour,
    En C je cherche à lire le contenu d'unbe page web. Comme je n'ai pas envie de réinventer la roue, j'ai cherché un code existant qui fait le travail, à base de socket, sans trucs propriétaires, sans "system". Et il fonctionne, je lis mon code HTML. Problème, seulement pour le nom de domains, en l'instance "www.random.org"
    alors que l'URL complète est "https://www.random.org/cgi-bin/randbyte?nbytes=10&format=d"

    QuestionJe suppose que la partie manquante doit être rentrée dans la description du socket, ou dans l'apell HTTP, mais je ne connais pas la structure de ces variables?

    Je ne donne pas en le code qui marche entier, car il est long et il vient d'un site "concurent":

    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
    /* Build the socket. */
        protoent = getprotobyname("tcp");
        if (protoent == NULL) {
            perror("getprotobyname");
            exit(EXIT_FAILURE);
        }
        socket_file_descriptor = socket(AF_INET, SOCK_STREAM, protoent->p_proto);
        if (socket_file_descriptor == -1) {
            perror("socket");
            exit(EXIT_FAILURE);
        }
     
        /* Build the address. */
        hostent = gethostbyname(hostname);
        if (hostent == NULL) {
            fprintf(stderr, "error: gethostbyname(\"%s\")\n", hostname);
            exit(EXIT_FAILURE);
        }
        in_addr = inet_addr(inet_ntoa(*(struct in_addr*)*(hostent->h_addr_list)));
        if (in_addr == (in_addr_t)-1) {
            fprintf(stderr, "error: inet_addr(\"%s\")\n", *(hostent->h_addr_list));
            exit(EXIT_FAILURE);
        }
        sockaddr_in.sin_addr.s_addr = in_addr;
        sockaddr_in.sin_family = AF_INET;
        sockaddr_in.sin_port = htons(server_port);
     
        /* Actually connect. */
        if (connect(socket_file_descriptor, (struct sockaddr*)&sockaddr_in, sizeof(sockaddr_in)) == -1) {
            perror("connect");
            exit(EXIT_FAILURE);
        }
     
        /* Send HTTP request. */
        nbytes_total = 0;
        while (nbytes_total < request_len) {
            nbytes_last = write(socket_file_descriptor, request + nbytes_total, request_len - nbytes_total);
            if (nbytes_last == -1) {
                perror("write");
                exit(EXIT_FAILURE);
            }
            nbytes_total += nbytes_last;
        }
    Merci de voir, je sens que peu de choses suffiraient à faire marcher ce code dans mon cas

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 146
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 146
    Billets dans le blog
    4
    Par défaut
    Tu as un code qui marche mais qui marche pas ?
    Si tu veux vraiment pas réinventer la roue, utilise curl.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 47
    Par défaut
    Hmmm... je ne cherche pas à réinventer la roue, lol juste trouver une roue qui marche. Depuis le temps que les gens font du C, bien du monde a du faire ça. Je demande juste un programme qui marche avec une URL complète, sans y passer des semaines :-)
    Pour info, en PHP j'ai utilisé la méthode avec socket, sans difficulté particulière. Mais mon projet ne pourra pas marcher en PHP

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 526
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Novembre 2006
    Messages : 8 526
    Par défaut
    bonjour ça ne peut pas marcher pour la simple raison qu'il faut passer des paramètres à l'URL donc il y a certainement du Php côté serveur ce qui fait que les pages sont générées dynamiquement côté client web.

  5. #5
    Membre chevronné
    Homme Profil pro
    très occupé
    Inscrit en
    Juillet 2014
    Messages
    137
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : très occupé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 137
    Par défaut
    Comme tu gères ta communication avec les sockets, ta connexion est établie avec l'adresse IP correspondant au nom d'hôte (www.example.com), qui doit être dans ta variable hostname dans ton code, traitée par gethostbyname().

    S'agissant de la requête elle même, c'est dans le texte que tu envoies au serveur que tu dois la mettre. Tu dois envoyer avec write() ta requête http GET selon le format attendu par le protocole HTTP par le serveur auquel tu seras connecté.

    Tu me montres pas ce que contient ta variable "request" dans ton code.

    Tu dois y mettre GET suivi de la ressource demandée sur le serveur (ce qui est à droite du nom de domaine dans l'URL), suivi de l'indication du protocole et sa version (HTTP/1.0 par exemple) suivi d'un retour à la ligne (CRLF) et d'une ligne vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char request[] = "GET /cgi-bin/randbyte?nbytes=10&format=d HTTP/1.0\r\n\r\n";
    et ensuite recevoir la réponse et la parser pour l'utiliser.

    Note que si le site force la communication en https, tu vas devoir gérer une connexion TLS pour obtenir ce que tu veux, et là tu ferais mieux d'utiliser OpenSSL sauf à vouloir réécrire ta propre bibliothèque d'authentification et de chiffrement.

    Tu as des exemples d'utilisation des sockets pour générer des requêtes http GET (ou POST) là :

    https://stackoverflow.com/questions/...g-the-response

    Il peut être plus simple, et plus robuste, d'utiliser une bibliothèque comme libcurl, comme cela t'a été proposé.

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 47
    Par défaut
    Merci à -Eks-
    Votre réponse me semble claire, et je me doutais que ce serait dans la requête.
    Pour le moment je suis pas installé pour programmer, mais dès que je reviens sur ce sujet je testerai ça.
    Merci :-)

Discussions similaires

  1. Ecrire sur une page internet avec Caml
    Par nasdaq dans le forum Caml
    Réponses: 0
    Dernier message: 30/10/2011, 18h15
  2. Réponses: 2
    Dernier message: 21/06/2011, 12h06
  3. [XL-2000] Remplir un champ texte d'une page internet avec une macro sous excel 2000
    Par salent9 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 17/05/2011, 21h40
  4. [XL-2003] Récupérer des données d'une page internet avec login
    Par yoyo_l dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 20/08/2009, 22h58
  5. Ouvrir une page internet avec navigateur par défaut
    Par m_piou dans le forum Administration système
    Réponses: 2
    Dernier message: 16/01/2008, 23h19

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