2009-05-05 12 views
2

Je travaille sur une ancienne version linux (QNX pour être exact) et j'ai besoin d'un moyen de récupérer une page web (pas de cookies ou de connexion, l'URL cible est juste un fichier texte) en utilisant uniquement des sockets et des tableaux.Quel est le moyen le plus simple de récupérer une page Web en C?

Quiconque a obtenu un extrait de cette photo?

note: Je ne contrôle pas le serveur et j'ai très peu de choses à travailler en plus de ce qui est déjà sur la boîte (ajouter des bibliothèques supplémentaires n'est pas vraiment "facile" étant donné les contraintes - bien que j'aime libcurl)

+0

Pouvez-vous garantir pas de proxy, pas de SSL, pas de gzip? Et contrôlez-vous le serveur? – MSalters

+1

vous avez dit n'utiliser que des sockets et des tableaux, mais si vous voulez reconsidérer, utilisez wget et redirigez sa sortie vers un gestionnaire de fichiers: FICHIER * fp = popen ("wget ​​--quiet -O - http://www.google .com "," r ") –

+1

Peu important, mais depuis quand QNX est-il une variante Linux?Ils sont tous les deux Unix, mais AFAIK il n'y a pas de relation directe entre eux. QNX est un micro-noyau, et Linus n'aime pas ceux-là. –

Répondre

8

J'ai du code, mais il supporte aussi SSL (Open) donc c'est un peu long à poster ici.

En substance:

  • analyser l'URL (diviser en schéma d'URL, le nom d'hôte, le numéro de port, une partie spécifique du système

  • créer le socket:

    s = socket(PF_INET, SOCK_STREAM, proto);

  • remplir une structure sockaddr_in avec l'adresse IP et le port à distance

  • connecter la prise à l'extrémité:

    err = connect(s, &addr, sizeof(addr));

  • faire la chaîne de demande:

    n = snprinf(headers, "GET /%s HTTP/1.0\r\nHost: %s\r\n\r\n", ...);

  • envoyer la chaîne de demande:

    write(s, headers, n);

  • lire les données:

    while (n = read(s, buffer, bufsize) > 0) { ... }

  • fermer la prise:

    close(s);

nb: pseudo-code serait au-dessus de recueillir les deux têtes de réponse et données. La séparation entre les deux est la première ligne vide.

+1

Vous semblez manquer la requête, c'est-à-dire envoyer le fichier GET /blah.htm. – Rob

+0

Je l'ai ajouté comme vous avez posté votre commentaire – Alnitak

+0

Belle réponse détaillée, +1 (peut-être mettre le code SSL sur pastebin?) – Andrioid

9

Je regarderais libcurl si vous voulez le soutien de SSL pour ou n'importe quoi de fantaisie.

Toutefois, si vous voulez simplement obtenir une page Web simple à partir d'un port 80, alors ouvrez simplement un socket tcp, envoyez "GET /index.html HTTP/1.0\n\r\n\r" et analysez la sortie.

+0

rE: libcurl - et ajoute probablement probablement plusieurs 100 Ko et Dieu sait combien de dépendances de bibliothèque à l'exécutable de votre programme ... – Alnitak