Webseite auslesen
-
Sqwan schrieb:
Meine Variablen sind alle in Private:
und meine Funktion SetIP, da diese auschließlich von der Klasse genutzt wird.hmm? Wieso das SetIP ins private?
warum nicht so was:struct Tip { unsigned char a, b, c, d; Tip (unsigned char _a, unsigned char _b, unsigned char _c, unsigned char _d) : a (_a), b (_b), c (_c), d (_d) {}; }; class Tsocket { private: sockaddr addr; public: SetIP (const std::string &url) {/*...*/}; SetIP (const Tip &ip) {/*...*/}; }
Sqwan schrieb:
Einen constructor habe ich zur Zeit nicht. Destructor fehlt auch.
Da muss ich nochmal in meinem Buch schaun wie das geht.der name der klasse / des structs / ...
class A { public: A (/*parameter*/) /*: initialisierungsliste*/ {/*code*/} }; class konkretes_bsp { private: int dummy; bool flag; public: konkretes_bsp (_dummy = 0) : dummy (_dummy), flag (false) {} //eigtl unnötig, weil man auch _flag = false schreiben könnte, aber wollt ma zeigen, dass es mehr als einen ctor geben kann konkretes_bsp (_dummy, _flag) : dummy (_dummy), flag (_flag) {} ~konkretes_bsp () {/*leerer Desutrctor, brauchst du zwar nicht, aber ich wollts ma mit genannt haben, weils ja hier ganz gut passt ^^*/} };
Sqwan schrieb:
__construct <-- So ists in PHP... Ich glaube hier wars anders.
Joar - aber so weit ich weiß, nimmt PHP auch den Klassenname statt __construct?
Sqwan schrieb:
so... nun ists das leider noch ziemlich viel C.
Jetzt ist die Frage:
Lohnt es sich das zu ändern?Japp, es lohnt sich immer in C++ zu programmieren... Was meinst du denn mit viel C genau? Die WinAPI-Fkt bekommste leider nicht anders ^^
Sqwan schrieb:
was ich auch nicht ganz verstehe ist:
sprintf (send_buf,"GET /%s HTTP/1.0", "www.google.de");
nun bin ich mir ziemlich sicher, dass erstens meine Headerinformation nicht korekt ist, und sprintf nicht korrekt ist (schließe ich aus einen post am anfang)Wie das geht steht hier
sprintf und konsorten sind übrigens so ein Beispiel, was pures C ist und in C++ nichts zu suchen hat...std::string GetHTTPHeader (const std::string &host, const std::string &datei = "index.php") { return "GET /" + datei + " HTTP/1.1\r\nHost: " + host; }
Sqwan schrieb:
kann mir da vllt noch mal ausgeholfen werden?
Das sollte ja erst mal alles sein... Aber da war wieder fast nichts dabei, was man nicht mit paar Minuten Geduld ergoogelt hätte...
btw: Gut möglich, dass der HEader falsch ist, den ich da erzeuge - ich hab den Artikel nur überflogen und das erste Beispiel einfach verändert...
bb
-
Soa... falls es das prob nocheinmal gibt. Hier steht wie das aussehen muss.
-
Also hier im Forum schaffe ichs nicht mich einzuloggen.
Header sieht so aus:"POST /forum/login-var-.html HTTP/1.1\r\n"
"Host: c-plusplus.net\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n"
"Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n"
"Cache-Control: no\r\n"
"Accept-Language: de,en;q=0.7,en-us;q=0.3\r\n"
"Referer: http://web-sniffer.net/\r\n"
"Content-type: application/x-www-form-urlencoded\r\n"
"Content-length: 33\r\n"
"Connection: close\r\n\r\n"
"login=Login&password=xxxxxx&username=sqwan\r\nHier kriege ich immer die antwort, dass man nutzername oder mein PW falsch ist.
Ich weiß aber, dass es richtig ist.Auf einer anderen Seite habe ich es glaube ich geschafft mich erfolgreich auf der webseite einzuloggen. Als antwort vom Webserver bekomme ich:
HTTP/1.1 302 Found
Date: Sun, 10 Aug 2008 09:24:21 GMT
Server: Apache/2.2.3 (Debian) PHP/5.2.0-8+etch11
X-Powered-By: PHP/5.2.0-8+etch11
Set-Cookie: PHPSESSID=ac0d6677115c0931486117abef8ceca2; path=/
Expires: Thu, 19 Nov 1981 08:52:00 GMT
Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
Pragma: no-cache
Location: game.php?a=login
Vary: Accept-Encoding
Content-Length: 0
Connection: close
Content-Type: text/html; charset=ISO-8859-1nun habe ich versucht die seite start.php mit einer GET anfrage auszulesen.
Jedoch kriege ich auf meine anfrage keine antwort. Meine Anfrage sieht so aus:"GET /game.php HTTP/1.1\r\n"
"Host: iliath.kampf-um-mittelerde.de\r\n"
"User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)\r\n"
"Accept-Charset: ISO-8859-1,UTF-8;q=0.7,*;q=0.7\r\n"
"Cache-Control: no\r\n"
"Accept-Language: de,en;q=0.7,en-us;q=0.3\r\n"
"Referer: http://web-sniffer.net/\r\n"
"Content-type: application/x-www-form-urlencoded\r\n"
"Content-length: 33\r\n"
"Connection: close\r\n\r\n"
"a=login\r\n"Hierdrauf bekomme ich jedoch keine antwort. 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?
Wenn ich das direkt anfrage ohne mich einzuloggen gehts auch...
-
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...