HTTP - internetseiten öffnen [problem gelöst]


profpaule

Still Fresh
Joined
May 11, 2007
Messages
54
Location
in meine kabuff
ICQ
580817124
LOCATION
in meine kabuff
hallo,

angenommen, ich würde einen browser für'n pc, gp2x und pandora basteln und darum nur systemunanhängige libs benutzen wollen, wie öffne ich dann beispielsweise http://example.com/index.html so, dass ich das wie ne normale datei auslesen kann? (sprich: zeile für zeile auslesen)

ein link zu der passenden lib wär nett. und kommentare zum projekt a la "sowas gibts schon" bringen mich auch nicht voran.

danke!
 
Re: HTTP - internetseiten öffnen

<r>Im Prinzip brauchst Du nur eine TCP-Verbindung zum Server aufbauen und "sprichst" dann mit dem HTTP (<URL url="ftp://ftp.isi.edu/in-notes/rfc2616.txt"><s></s>ftp://ftp.isi.edu/in-notes/rfc2616.txt<e></e></URL>). Das ist eigentlich in jeder Sprache mit den Standard-Libraries möglich.<br/>
Zeilenweise auslesen ist dabei nicht wichtig, am sinnvollsten wäre es den Netzwerk-Stream auch als Stream zu behandeln.<br/>
<br/>
EDIT: Ah, C++-Forum, geht wohl um C++. <E>:)</E> Da hat sich die Frage nach der Sprach wohl erübrigt. <br/>
Boost soll da nicht schlecht sein, habe ich allerdings noch nie benutzt, bin nicht so der C-Freak. Deren Beispiel-HTTP-Client sieht aber recht verständlich aus (<URL url="http://www.boost.org/doc/libs/1_37_0/doc/html/boost_asio/examples.html#id2656715"><s></s><LINK_TEXT text="http://www.boo...t_asio/examples.html#id2656715</LINK_TEXT><e></e></URL>).</r>
 
Re: HTTP - internetseiten öffnen

<t>Wenn es sich nur um Daten auf deinem eigenen Webserver handelt, kannst du die Platte auch lokal als Netzlaufwerk einhängen und dann normal mit open auf die Dateien zugreifen. Wenn du wirklich nen Browser für alle Websites erstllen willst, dann solltest du ein Team an Programmierer und sehr gute Kenntnisse im Webdesign haben.</t>
 
Re: HTTP - internetseiten öffnen

<t>läuft dass dann auch auf nem wiz/pandora? vielleicht mach ich ja auch nen textbasierenden browser oder so *g* es soll ja nur für mich sein.<br/>
<br/>
ich suche lediglich eine kleine funktion, die eine datei aus dem internet (ob zeilenweise oder sonstwie) zurückliefert. bin ich da zu blauäugig, zudenken, dass es soetwas gibt? ich hab nämlich echt keine lust mich in HTTP einzulesen, um eine seite runterzuladen. apropos runterladen... wegen meiner kann die funktion die datei auch runterladen und ich verarbeite den text dann nur noch...<br/>
trotzdem danke erstmal für die hilfe.</t>
 
Re: HTTP - internetseiten öffnen

<r>Libcurl sollte eigentlich bei jedem Linux dabei sein: <URL url="http://curl.haxx.se/">http://curl.haxx.se/</URL><br/>
<br/>
Hier ein minimal Beispiel, was ich mal vor einiger Zeit geschrieben hab: <URL url="http://trac.autopackage.org/attachment/ticket/79/autopackage-curl.c?format=raw"><LINK_TEXT text="http://trac.autopackage.org/attachment/ ... format=raw">http://trac.autopackage.org/attachment/ticket/79/autopackage-curl.c?format=raw</LINK_TEXT></URL><br/>
Es läd in eine Datei, aber du kannst auch in einen C-String einlesen.</r>
 
Re: HTTP - internetseiten öffnen

<t>totaler overkill für sowas einfaches.<br/>
Such die Adresse raus (gethostbyname), mach einen TCP socket() auf und connect()e zu der Server Adresse, Port 80.<br/>
Dann schreibst Du mit send() das hier:<br/>
<br/>
"GET index_seite.html HTTP/1.0\r\nHost:www.mein_server.de\r\nAccept: *" "/*\r\nUser-Agent: Wasweissichwas\r\n\r\n"<br/>
<br/>
Nun kannst Du die webseite lesen mir recv(). Du wiederholst recv() bis es 0 zurückgibt. Dann hast Du alles gelesen.</t>
 
Re: HTTP - internetseiten öffnen

<r><QUOTE author="GernotFrisch"><s>
GernotFrisch said:
</s>totaler overkill für sowas einfaches.<br/>
Such die Adresse raus (gethostbyname), mach einen TCP socket() auf und connect()e zu der Server Adresse, Port 80.<br/>
Dann schreibst Du mit send() das hier:<br/>
<br/>
"GET index_seite.html HTTP/1.0\r\nHost:www.mein_server.de\r\nAccept: *" "/*\r\nUser-Agent: Wasweissichwas\r\n\r\n"<br/>
<br/>
Nun kannst Du die webseite lesen mir recv(). Du wiederholst recv() bis es 0 zurückgibt. Dann hast Du alles gelesen.<e>
</e></QUOTE>
Naja, da er ja wahrscheinlich auch für Windows programmieren will, hat er es nicht 100% plattform übergreifend, da unter Windows an einigen stellen die Funktionen anders heißen. Außerdem will er ja einen Browser programmieren, da wären HTTP/1.1 und nicht-blockierende Funktionen schon nicht schlecht. Das ganze dann mit Sockets zu machen wird einfach zu kompliziert.</r>
 
Re: HTTP - internetseiten öffnen

<t>das ist ja alles schön und gut, aber wo ist der link zu weiterführenden informationen? wenn ich wüsste, wie das geht, dann würde ich nicht fragen, sondern ganz easy selber connecten, listen, sockets öffnen oder was auch immer. <br/>
<br/>
ich hab auch nicht den ganzen tag zeit, deswegen wäre eine anleitung (systemunabhängig) for dummies ganz nett.<br/>
<br/>
EDIT1: der browser war rein hypothetisch, ich will nur zeug aus dem netz ziehn.</t>
 
Re: HTTP - internetseiten öffnen

<r><QUOTE author="profpaule"><s>
profpaule said:
</s>das ist ja alles schön und gut, aber wo ist der link zu weiterführenden informationen? wenn ich wüsste, wie das geht, dann würde ich nicht fragen, sondern ganz easy selber connecten, listen, sockets öffnen oder was auch immer. <br/>
<br/>
ich hab auch nicht den ganzen tag zeit, deswegen wäre eine anleitung (systemunabhängig) for dummies ganz nett.<e>
</e></QUOTE>
Ich hatte dir schon den Link gegeben, musst dich nur durch bis zum Tutorial klicken: <URL url="http://curl.haxx.se/libcurl/c/libcurl-tutorial.html">http://curl.haxx.se/libcurl/c/libcurl-tutorial.html</URL><br/>
<br/>
Und hier ein Tutorial, wie das mit Sockets geht (was ich dir aber nicht empfehlen kann, wenn schon HTTP selber implementieren in C++, dann boost): <URL url="http://magazin.c-plusplus.de/artikel/Sockets%20und%20das%20HTTP-Protokoll"><LINK_TEXT text="http://magazin.c-plusplus.de/artikel/So ... -Protokoll">http://magazin.c-plusplus.de/artikel/Sockets%20und%20das%20HTTP-Protokoll</LINK_TEXT></URL></r>
 
Re: HTTP - internetseiten öffnen

<t>naja gut, dann mach ich die geschichte mit curl... das ist höchstwahrscheinlich die rationalste methode.<br/>
<br/>
vielen dank nochmal.</t>
 
GernotFrisch said:
Für Windows voher WSAStartUP() aufrufen. Dann geht's X-Platform
Und winsock2.h statt den anderen Header inkludieren. Und closesocket statt close benutzen. Und errno und strerror nicht verwenden, sonder WSAGetLastError und FormatMessage. Und SOCKET nicht verwenden, sondern int.
 
Das Toolchain fürs Terminal brauchst du eh, da IDEs ja eigentlich immer nur die vorhandenen Kommandozeilenprogramme benutzen. Da würde ich mitlerweile das open2x toolchain nehmen.
 
Nimm doch einfach "wget". Gibt es bestimmt auch für Windows. ;-)
 
Zum Cross-Platform-Netzwerken gibts auch SDL_net und boost asio. Beide unterstützen sowohl synchrones als auch asynchrones empfangen, boost asio glaub ich sogar asynchrones senden.

Für synchronen I/O mit SDL_net hab ich irgendwann mal nen Buffer geschrieben, damit kann man SDL Sockets wie nen C++ streambuf benutzen: TCPSocketStreamBuffer.h TCPSocketStreamBuffer.cpp (nicht ausgiebig getestet, hat aber bisher gut funktioniert :) )

Falls das alles viel zu simpel ist, ist die Posix Network API dein Ding. Die sollte theoretisch auch von jedem OS unterstützt werden (solche, die es nicht tun, sollten nicht auf herkömmlichen PCs eingesetzt werden ^^) und bietet fast alle erdenklichen Features, die eine Netzwerkverbindung so haben kann.

Ich habe auch mal eine Java-Ähnliche (TCP) Sockets API auf Basis von SDL_net (als Wrapper) geschrieben. Falls da Bedarf besteht, veröffentliche ich die auch gerne.
 
Ein kluger Rat:
Nimm die curl Bibliothek wie oben erwähnt :)
Wenn du lieber C++ nimmst gibt es einem C++ Wrapper curlpp

Denn die Library nimmt dir, wenn du es magst auch gleich Cookies ab, Cached DNS->IP Auflösungen, und zu guter letzt, unterstützt HTTP 1.1.
Damit wird verhindert, dass bei jedem HTTP Request eine neue TCP-Verbindung zum Server aufgebaut wird.
Spart also bei deinem Rechner und bei dem Server Resourcen und ist schneller ;).

Es gibt mittlerweile 1000. verschiedene HTTP Clients (und ja ich habe auch welche dazu beigesteuert), und hinterher festgestellt, dass HTTP eigentlich ein einfaches Protokoll ist, welches jedoch sehr flexibel ist.

Mit HTTP Headern über verschiedene Zeilen,
mit eingebetteten Mime Kommentaren,
Protokollwechsel,...
 
Back
Top