Inhalt einer Internetseite einlesen
-
Nicht so ungeduldig.

Es gibt verschiedene Möglichkeiten. Du kannst z.B boost::asio benutzen, was aber recht Overhead ist, wenn du lediglich eine Seite laden willst. (gäbe aber sogar ein Beispiel dazu, wie das damit geht).
Für das einfache lesen würde ich Betriebssystemspezifische Funktionen benutzen. Unter Windows benutze ich:
http://msdn.microsoft.com/en-us/library/aa385103(VS.85).aspxDu brauchst natürlich so das korrekte Handle, damit du die Funktion benutzen kannst..
Im übrigen kannst du lediglich den Quelltext runterladen. Mehr ist nicht verfügbar.. Du musst dann schon selbst dafür sorgen, dass du die korrekten Sachen parst.
-
Das geht relativ einfach. Zuerst öffnest Du (mit ganz gewöhnlichen Socket-Funktionen, socket(), connect()) eine Verbindung zum Webserver auf Port 80. Danach schickst Du folgenden String hin:
"GET /xxx HTTP/1.0\r\n\r\n"Das xxx steht dabei für die Seite die Du anfordern willst, also z.B. index.html. Lässt Du xxx ganz weg, dann liefert dir der Server seine default-Seite.
Als Rückantwort bekommst Du den HTTP-Header plus angehängter Seite. Die Trennung zwischen HTTP-Header und Seiteninhalt kannst Du als zwei aufeinanderfolgenden "\r\n" erkennen.
-
#include <boost/asio.hpp> #include <boost/array.hpp> #include <iostream> #include <string> boost::asio::io_service io_service; boost::asio::ip::tcp::resolver resolver(io_service); boost::asio::ip::tcp::socket sock(io_service); boost::array<char, 4096> buffer; void read_handler(const boost::system::error_code &ec, std::size_t bytes_transferred) { if (!ec) { std::cout << std::string(buffer.data(), bytes_transferred) << std::endl; sock.async_read_some(boost::asio::buffer(buffer), read_handler); } } void connect_handler(const boost::system::error_code &ec) { if (!ec) { boost::asio::write(sock, boost::asio::buffer("GET / HTTP 1.1\r\nHost: highscore.de\r\n\r\n")); sock.async_read_some(boost::asio::buffer(buffer), read_handler); } } void resolve_handler(const boost::system::error_code &ec, boost::asio::ip::tcp::resolver::iterator it) { if (!ec) { sock.async_connect(*it, connect_handler); } } int main() { boost::asio::ip::tcp::resolver::query query("www.highscore.de", "80"); resolver.async_resolve(query, resolve_handler); io_service.run(); }
-
Ok. Also der letzte Beitrag sagt mir jetzt gar nichts

Aber das andere werde ich mir mal angucken. Wenns nicht klappt, muss ich halt nochmal fragen
Danke schonmal.
-
One-Man-Army schrieb:
Ok. Also der letzte Beitrag sagt mir jetzt gar nichts

Aber das andere werde ich mir mal angucken. Wenns nicht klappt, muss ich halt nochmal fragen
Danke schonmal.
Schau hier, wenn du einen Einstieg zu boost::asio willst:
http://www.highscore.de/cpp/boost/asio.htmlDort ist auch der obige Code erklärt.
Allerdings finde ich das für das alleinige lesen einer Seite schon recht viel Code.

-
drakon schrieb:
Schau hier, wenn du einen Einstieg zu boost::asio willst:
http://www.highscore.de/cpp/boost/asio.htmlDort ist auch der obige Code erklärt.
Allerdings finde ich das für das alleinige lesen einer Seite schon recht viel Code.

Na aber drakon, das kenne ich aber besser von dir. Poste wenigstens den Link zur Doc dazu

-
Tipp: Nimm libcurl und versuch HTTP nicht selbst zu implementieren!
-
Kóyaánasqatsi schrieb:
drakon schrieb:
Schau hier, wenn du einen Einstieg zu boost::asio willst:
http://www.highscore.de/cpp/boost/asio.htmlDort ist auch der obige Code erklärt.
Allerdings finde ich das für das alleinige lesen einer Seite schon recht viel Code.

Na aber drakon, das kenne ich aber besser von dir. Poste wenigstens den Link zur Doc dazu

Nein. Eher nicht, da er
1. Besser nicht die Doku von boost dafür anschaut und
2. Er besser nicht asio dazu nehmen soll, wie auch rüdiger rät.
-
drakon schrieb:
2. Er besser nicht asio dazu nehmen soll, wie auch rüdiger rät.
Ok, warum?
-
Kóyaánasqatsi schrieb:
drakon schrieb:
2. Er besser nicht asio dazu nehmen soll, wie auch rüdiger rät.
Ok, warum?
Riesen Overhead für eine Kleinigkeit.
-
Kóyaánasqatsi schrieb:
drakon schrieb:
2. Er besser nicht asio dazu nehmen soll, wie auch rüdiger rät.
Ok, warum?
Weil HTTP einfach mehr ist, als ein GET zu senden. Wenn der Server nun mit einem chunked encoding antwortet oä. Mit libcurl hat er das eben alles implementiert und die Daten können auch gziped sein oder über SSL laufen. Es ist einfach aufwendig, wenn man HTTP selbst implementieren will und genug kaputte HTTP Implementierungen gibt es bereits.