Simple TXT Dateien aus dem Internet auslesen
-
rüdiger schrieb:
@Dummie
Bei HTTP nimmt man \r\n und nicht \n! Außerdem solltest du den Header interpretieren. Können ja Fehler auftreten oder der könnte dir die Daten chunked-Encoded liefern.Nicht umsonst empfehle ich libcurl. HTTP ist nicht ganz so einfach wie es auf den ersten Blick aussieht...
alfonsospringer schrieb:
vielen dank für deine ganze mühe patrick - ich denke jetzt habe ich eine Ausgangsbasis für meine weiteren Studien
ich würde dir eher Boost.ASIO oder Boost.iostreams in Kombination mit Sockets empfehlen.
Ansonsten gibt es glaube ich ein Artikel dazu im C++-Magazin.
Hast schon recht, aber in erster Linie gehts ums Prinzip. Auf der anderen Seite warum sollte man so viel Aufwand betreiben um eine simple Textdatei runterzuladen? Entweder es hat geklappt oder nicht, was interessieren mich da noch Statusmeldungen oder sonstiger Krams. Und ja es gibt einen Artikel
Edit 1: Zu schnell geschrieben... Rechtschreibung
Edit 2: Mit \r\n funktionierts nicht, das war wohl auch der Grund warum ich \n\n benutzt habe...
-
HTTP-Abfragen gehören definitiv zu den Sachen, die hier im Forum immer wieder versucht werden händisch zu machen und in 99% aller Fälle geht das in die Hose. Wie hier zum Beispiel in dem Thread. Ein einfaches \n ist kein Zeilentrenner im HTTP-Protokoll. Dafür nimmt man \r\n (am Ende der Anfrage eben \r\n\r\n). Einige Server könnten standardmäßig ein Host-Header-Field erwarten. Für HTTP/1.1 ist dies sogar vorgeschrieben.
Die Statusmeldung sagt dir ja, ob es geklappt hat oder nicht. Außerdem sagt sie dir zB wie groß die Datei ist oder ob die Datei in einem Encoding verschickt wird. Dein Code zB lässt sich mit einem bösen Server in undefiniertes Verhalten bringen etc.
Warum sich also die Mühe machen und das versuchen selbst zu implementieren, wenn man wohlgetestete und effizient implementierte Lösungen bereits hat (zB libcurl)?
Lasst bitte die Finger davon Protokolle zu implementieren auf Basis von "Hören/Sagen". Wenigstens ein Blick in die RFC (oder Spec) sollte man tun!
-
Wenn ich ein einfach verständlcihes Libcurl Tutorial mit Installationsanleitung für Code::Blocks finden würde würde ich es sofort ausprobieren
-
Kann mir mal jemand erklären warum die Funktion zum empfangen von Daten in meiner Klasse nicht funktioniert?
-
alfonsospringer schrieb:
Kann mir mal jemand erklären warum die Funktion zum empfangen von Daten in meiner Klasse nicht funktioniert?
Nein.
-
Ich hoffe doch schwer, dass das ein Scherz sein sollte
-
erklärber schrieb:
alfonsospringer schrieb:
Kann mir mal jemand erklären warum die Funktion zum empfangen von Daten in meiner Klasse nicht funktioniert?
Nein.
Auch ich kanns dir nicht sagen, aber ich vermute der Fehler liegt daran, dass die Klasse gar nicht existiert... Für uns
Trink nicht so viel Kaffee
-
Alfonsospringer schrieb:
#include <windows.h> #include <winsock2.h> #include <iostream> #include <string.h> using namespace std; class client { private: long rc; WSADATA wsa; SOCKET s; SOCKADDR_IN addr; int port; string ip; char se[256]; char re[256]; public: client(string ip, int port) { rc=WSAStartup(MAKEWORD(2,0),&wsa); if(rc!=0) { cout<<"Fehler: startWinsock, fehler code: "<<rc<<endl; } else { cout<<"Winsock gestartet!"<<endl; }; s=socket(AF_INET,SOCK_STREAM,0); if(s==INVALID_SOCKET) { cout<<"Fehler: Der Socket konnte nicht erstellt werden, fehler code: "<<WSAGetLastError()<<endl; } else { cout<<"Socket erstellt!"<<endl; }; memset(&addr,0,sizeof(SOCKADDR_IN)); addr.sin_family=AF_INET; addr.sin_port=htons(port); // wir verwenden mal port 12345 addr.sin_addr.s_addr=inet_addr(ip.c_str()); rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR)); if(rc==SOCKET_ERROR) { cout<<"Fehler: connect gescheitert, fehler code: "<<WSAGetLastError()<<endl; } else { cout<<"Verbunden mit "<<ip<<endl; }; }; void data(string data) { strcpy(se,data.c_str()); send(s,se,data.length(),0); }; char data() { recv(s,re,256,0); return re; }; };
Hier also nochmal die nicht existente Klasse
Könnt ihr mir jetzt villeicht erklären, warum's nicht funktioniert?
-
alfonsospringer schrieb:
Könnt ihr mir jetzt villeicht erklären, warum's nicht funktioniert?
Was funktioniert nicht? Fehlermeldungen...?
char data() { recv(s,re,256,0); return re; }; // Der ; ist überflüssig, aber wenn es dir gefällt...
Ich würde mal vermuten, dein Rückgabewert ist falsch...
Gruß
Patrick
-
Ich denke da hasst du recht. Der Compiler meldet invalid conversion ...
Aber eigentlich bekommt man durch die recv Funktion doch Daten des Typs char zurück, oder?