2009-05-05 7 views
2

Ich arbeite an einer alten Schule Linux-Variante (QNX um genau zu sein) und brauchen eine Möglichkeit, eine Webseite (keine Cookies oder Login, die Ziel-URL ist nur eine Textdatei) greifen nur mit Sockets und Arrays.Was ist der einfachste Weg, um eine Webseite in C zu bekommen?

Wer hat ein Schnipsel dafür?

Hinweis: Ich kontrolliere nicht den Server und ich habe sehr wenig zu arbeiten außer dem, was bereits auf der Box ist (Hinzufügen zusätzlicher Bibliotheken ist nicht wirklich "einfach" angesichts der Einschränkungen - obwohl ich liebe libcurl)

+0

Können Sie keine Proxies garantieren, kein SSL, kein gzip? Und steuern Sie den Server? – MSalters

+1

Sie haben gesagt, dass Sie nur Sockets und Arrays verwenden, aber wenn Sie dies noch einmal überdenken möchten, verwenden Sie wget und leiten Sie die Ausgabe an einen Dateihandler: FILE * fp = popen ("wget ​​--quiet -O - http://www.google .com "," r ") –

+1

Unwichtig, aber seit wann ist QNX eine Linux-Variante?Sie sind beide Unix-ähnlich, aber AFAIK gibt es keine direkte Beziehung zwischen ihnen. QNX ist ein Mikrokernel, und Linus mag diese nicht. –

Antwort

8

Ich habe einige Code, aber es unterstützt auch (Open) SSL, so dass es ein bisschen lang ist, hier zu posten.

Im Wesentlichen:

  • die URL analysiert (aufzuschlüsseln URL-Schema, Hostnamen, Portnummer-Schema Teil

  • die Fassung erstellen:

    s = socket(PF_INET, SOCK_STREAM, proto);

  • füllen Sie eine sockaddr_in Struktur mit der Remote-IP und Port

  • verbinden Sie die Buchse an das ferne Ende:

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

  • die Anfrage String machen:

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

  • die Anfrage String senden:

    write(s, headers, n);

  • die Daten lesen:

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

  • Schließen der Sockel:

    close(s);

nb: Pseudocode oben würde sammeln beide Antwortheader und Daten. Die Trennung zwischen den beiden ist die erste Leerzeile.

+1

Sie scheinen die Anfrage zu verpassen, d. H. Die GET/blah.htm zu senden. – Rob

+0

Ich habe es hinzugefügt, als Sie Ihren Kommentar posten – Alnitak

+0

Schöne detaillierte Antwort, +1 (vielleicht legte der SSL-Code auf Pastebin?) – Andrioid

9

Ich würde auf libcurl schauen, wenn Sie SSL-Unterstützung für oder etwas Phantasie wollen.

Wenn Sie jedoch nur eine einfache Webseite von einem Port 80 erhalten möchten, öffnen Sie einfach einen TCP-Socket, senden Sie "GET /index.html HTTP/1.0\n\r\n\r" und parsen Sie die Ausgabe.

+0

RE: libcurl - und fügen Sie wahrscheinlich mehrere 100 KB und goodness weiß, wie viele Bibliothek Abhängigkeiten zu Ihrem Programm ausführbar ist ... – Alnitak

Verwandte Themen