Webseite auslesen
-
sqwan schrieb:
Kann ich denn über einen socket oder so nur eine Anfrage senden? Oder nur einmal empfangen? Glaube ich iwie nicht dran. Aber woran liegt es sonnst?
Naja - du wirst getrennt, wenn du fertig empfangen hast und musst vor jedem Senden also die Verbindung wieder neu herstellen... (http ist ein zustandsloses protokoll)
also:
[verbinden] >> GET bla bla login&bla... << HTTP blabla [disc] [neu verbinden] >> GET bla bla login&bla... << HTTP blabla [disc] [neu verbinden] >> GET bla bla login&bla... << HTTP blabla
usw...
Ich würde übrigens die Zeile mit "Referer: ..." weglassen - die brauchst du nicht, so weit ich das jz richtig verstanden habe...
Ich bin mir jetzt nicht ganz sicher, aber das sieht falsch aus:
[...] "Content-length: 33\r\n" [...] "login=Login&password=xxxxxx&username=sqwan\r\n
Also:
login=....
ist selbst ohne pwd länger als die 33 zeichen... (37 + pwd-länge + "\r\n"-länge (sollte insg. 2 sein)- kein plan, ob der Zeilenumbruch am Ende sein muss / darf / soll / ...
So was würde dir sicherlich nicht passieren, wenn du ne ordentliche Funktion (oder Klasse) hättest, die dir diese Header bastelt!
bb
-
das ist richtig, eine headerfunktion/Klasse wäre nicht schlecht.
Dafür muss ich ertmal soweit mit headern klar kommen um daraus eine zu machen.
Danach werde ich das auch machen...
Weil dann habe ich zu viele header...Aber wenn ich immer wieder neu verbinde, bin ich dann noch eingeloggt?
Ich probiers gleich mal. Die frage ist dann nur woher ich weiß, ob das ergebnis richtig ist, wenn ich es nicht kenne...
-
Klar... Du bekommst doch auch gaaaaaaaaaaaaaanz viel datenmüll...
durch das>> HTTP bla bla
wollte ich das mal andeuten...bb
-
Also erst mal habe ich mir eine Klasse für die header gemacht...
#include <iostream> #include <string.h> class make_header { private: string header; string host; string http_v; public: //----------GET_CREATED_HEADER----------// string get_created_header() { return header; } //----------SET_HOST-------------------// void set_host(string h) { host = h; } //----------SET_HTTP_VERSION-----------// void set_http_v(string version) { http_v = version; } //----------CREATE_GET_HEADER--------------// string create_get(string datei) { header= "GET /"+datei+" HTTP/"+http_v+"\r\n" "Host: "+host+"\r\n" "Connection: Close\r\n\r\n"; return header; } //----------CREATE_POST_HEADER---------// string create_post(string datei, string content) { header= "POST/"+datei+" HTTP/"+http_v+"\r\n" "Host: "+host+"\r\n" "Content-type: application/x-www-form_urlencoded\r\n" "Content-length: "+strlen(content)+"\r\n" "Connection: Close\r\n\r\n" +content+"\r\n"; return header; } }
wenn ich die jetzt mit #include "make_header.c" includen möchte gibts ne menge fehler... Kann ich die so nicht includen, oder ist meine klasse falsch?
-
Bei so einer detaillierten Fehlermeldung tipp ich mal auf folgendes:
a) string.h ist schon einmal nicht (mehr) standardkonform
b) std:: vor cout/endl etc
c) std:: vor string
d) was für Fehlermeldungen?!
-
Also das fängt schon nach dem include an.
Compiler: Default compiler
Führt gcc.exe... aus
gcc.exe "G:\C++\make_header.c" -o "G:\C++\make_header.exe" -I"C:\Dev-Cpp\include" -L"C:\Dev-Cpp\lib" -lws2_32
G:\C++\make_header.c:1:20: iostream: No such file or directoryG:\C++\make_header.c:4: error: syntax error before "make_header"
G:\C++\make_header.c:5: error: syntax error before '{' tokenG:\C++\make_header.c:8: warning: data definition has no type or storage class
G:\C++\make_header.c:9: error: syntax error before "http_v"
G:\C++\make_header.c:9: warning: data definition has no type or storage class
G:\C++\make_header.c:11: error: syntax error before ':' token
G:\C++\make_header.c:18: error: syntax error before "h"
G:\C++\make_header.c: In functionset\_host': G:\\C++\\make_header.c:20: error:
h' undeclared (first use in this function)
G:\C++\make_header.c:20: error: (Each undeclared identifier is reported only once
G:\C++\make_header.c:20: error: for each function it appears in.)
G:\C++\make_header.c: At top level:
G:\C++\make_header.c:23: error: syntax error before "version"
G:\C++\make_header.c: In functionset\_http_v': G:\\C++\\make_header.c:25: error:
version' undeclared (first use in this function)
G:\C++\make_header.c: At top level:
G:\C++\make_header.c:28: error: syntax error before "create_get"
G:\C++\make_header.c:28: error: syntax error before "datei"
G:\C++\make_header.c: In functioncreate\_get': G:\\C++\\make_header.c:30: error:
header' undeclared (first use in this function)
G:\C++\make_header.c:30: error:datei' undeclared (first use in this function) G:\\C++\\make_header.c: At top level: G:\\C++\\make\_header.c:36: error: syntax error before "create\_post" G:\\C++\\make_header.c:36: error: syntax error before "datei" G:\\C++\\make\_header.c: In function
create_post':
G:\C++\make_header.c:38: error:header' undeclared (first use in this function) G:\\C++\\make_header.c:38: error:
datei' undeclared (first use in this function)
G:\C++\make_header.c:41: error:content' undeclared (first use in this function) G:\\C++\\make_header.c: At top level: G:\\C++\\make_header.c:46: error: syntax error before '}' token G:\\C++\\make_header.c: In function
main':
G:\C++\make_header.c:53: error:cout' undeclared (first use in this function) G:\\C++\\make_header.c:53: error:
endl' undeclared (first use in this function)
G:\C++\make_header.c:49: warning: return type of 'main' is not `int'Ausführung beendet
-
Nimm einfach mal den C++-Compiler g++, nicht den C-Compiler...
(EDIT: Wenn das die IDE selbst macht, nimm einfach mal die C++-Dateiendung .cpp, nicht die C-Dateiendung)
-
Ohhhhhhhhhhhhkay...
Erst einmal ist die Endung eines Header .h oder .hh oder von mir aus auch .H oder sowas. Und dann kompiliert man keine Header. Man inkludiert sie.
Und wenn er iostream nicht findet dann hast du entweder eine fehlerhafte Installation oder einen alten Compiler.
-
also.... ich habe nun 2 klassen... eine für die header
eine für die connection...leider kann ich beide klassen aber nicht kombinieren, denn die funktionen in der connection klasse können keine strings sondern nur char* verarbeiten...
So sehen die betroffenen funktionen aus:
int set_host(char * host){ if( SOCKET_ERROR == generate_ip(host,&addr) ){ c_out("Hostname konnte nicht aufgeloest werden!"); return 1; }else{ c_out("Hostname in IP aufgeloest!"); return 0; } } int recive(char * header) { string recvs=""; long rc; char recv_buf[66000]; send(s,header,strlen(header),0); int i = 0; while((rc=recv(s,recv_buf,66000,0))>0) { //recvs=recvs+recv_buf; cout<<recv_buf<<endl; } return 0; }
nun frage ich mich, welchen sinn es macht strings zu verwenden, wenn die funktionen sie eh nicht verwerten können, und ob es vllt andere funktionen gibt.
grade die recive funktion ist da sehr wichtig. denn wenn ich den header eh immer von hand bauen muss, kann ich mir meine headerklasse spaaren...Was bzw wie kann ich daran gehen, dass da was gescheites bei rumkommt....
Ein lauffähiges bsp habe ich hier:
http://sqwan.su.funpic.de/C++/connection.cpp
http://sqwan.su.funpic.de/C++/main.cpp
http://sqwan.su.funpic.de/C++/versuch.cppMFG Sqwan
-
Wie wäre es, wenn du dir zuerst einmal ein C++ Tutorial oder gar ein Buch zu Gemüte führst?
-
da habe ich das her...
Tja... weiter gebracht hat mich dein Tipp auch nicht...