Webseite auslesen
-
Sqwan schrieb:
Da gibbet dann nurnoch das Problem, dass ich das überhaupt nicht verstehe, was aber wichtig ist wenn ich eine Software neu/umgestalten bzw erweitern möchte. Deshalb wollte ich das Problem schritt für schritt angehen, und so wenig wie möglich mit Variablen hantieren und den schritt bei dem ich grade bin dann auch verstehen.
Wie weit ist es denn mit deinen Kenntnissen in C++ bzw. (da Sockets) in C her? Hast du keinen Schimmer von der Sprache selber oder von der Materie der Socketprogrammierung? Wenn ersteres, dann solltest du die Sprache, in der du arbeiten willst, erstmal grundsätzlich lernen und das geht nicht von jetzt auf gleich. Ist es letzteres, dann guck dir bitte mein vorletztes Posting bzw. das Buch, das ich dir dort empfehle, an.
PS: Du könntest dein Vorhaben doch auch prima in PHP umsetzen
-
Und wenn man was verstehen möchte ist msdn.de keine Doku sondern eine krankheit.
Denk, das liegt nicht an der Doku, sondern am leser.
simon
-
In PHP? Da ist es möglich mich auf anderen seiten einzuloggen?
c/cpp an für sich kann ich... Jedenfalls in der Console.
-
Sqwan schrieb:
In PHP? Da ist es möglich mich auf anderen seiten einzuloggen?
Ich stelle mir das in php gerade einfacher als in C/C++ vor.
c/cpp an für sich kann ich... Jedenfalls in der Console.
Na dann solltest du dir mal das von mir genannte Buch angucken...unter der Prämisse, dass du das wirklich etwas ernsthafter betreiben und nicht nur Codefragmente irgendwelcher Leute aus dem Internet zusammenklatschen willst.
-
aber das ist ja nicht meine seite. Was soll ich denn da machen?
An den Inhalt nicht geschützter seiten komme ich ja leicht dran mit PHP.
Aber das ich mich auf anderen seiten einloggen kann ohne sql-injections (kA ob das mit php geht) habe ich noch nicht gehört.@Berufspenner
Sicher mag dein Buch nicht schlecht sein. Nur ist es mir zu teuer, wo ich den Umfang noch nicht kenne. Jenach dem wenn ich da mal nen anfang habe, werde ich mir das vllt durchlesen, und das ganz mit einer GUI versehen.
-
Sqwan schrieb:
aber das ist ja nicht meine seite. Was soll ich denn da machen?
Wenn das PHP-Manual so gut ist, warum hast du's dann nicht benutzt um zu suchen was du brauchst?
Kennst du meinen Freund google schon? Damit hab ich folgendes z. B. sofort gefunden:
http://www.php.net/CLI
http://www.php.net/manual/en/ref.sockets.php
-
@Blue-Tiger
Diesen service werden wohl die wenigsten webserver einem normalen user zu verfügung stellen. Und ich glaube nicht, dass sich das jeder @ home installiert...
Aber egal... Wenn du mal durchgeschaut hast, fällt dir sofort auf, dass überall massig leicht zu verstehende Beispiele sind... Aber ich mag mich auch nicht drum kümmen welche doku nun besser ist, da wohl kaum jemand für mich die msdn ändert.so... nun back 2 topic... Ich habe nun soweit fertig was ich brauche... kann damit auch zu meinem Apache-Server connecten. Allerdings würde es mir nun helfen, wenn jemand ein kleines Beispiel zum ermitteln der IP-Adresse zu einer eingegeben url posten könnte. Da ist in dem Beispiel zwar ein fertiges, aber das verstehe ich garnicht. Schon alleine weil da so viel fehlerbehandlung drinne ist...
EDIT: Die PHP-Manual gibbet auch auf gutem Deutsch
-
Soa... ready...
Leider in C und ohne klasse... Jetzt hätte ich das aber gerne in einer klasse:class Lesen { public: long rc; SOCKET s; SOCKADDR_IN addr; void start_winsock() { this.rc=startWinsock(); if(this.rc!=0) { cout<<"Fehler: startWinsock, fehler code: "<<this.rc<<endl; return 1; } else { cout<<"Winsock gestartet!"<<endl; } } };
dummerweise gibt das einen Fehler:
z.B.: rc is not a type...Weiß jemand wie ich das ändern kann?
OOP in C++ habe ich lange nimmer gemacht...
Ich habe mich da mal ganz grob an java gehalten...
Da dürfte es funktionieren...
-
this->rc
-
In PHP gibts doch auch OOP... Zwar nicht so ausgeprägt, wie in C++, aber das sieht doch echt so aus, als ob du noch nicht mal wüsstest, wie man den PHP-tag aufmacht tT
Sqwan schrieb:
class Lesen { public: long rc; SOCKET s; SOCKADDR_IN addr; void start_winsock() { this.rc=startWinsock(); //fehler if(this.rc!=0) //fehler { cout<<"Fehler: startWinsock, fehler code: "<<this.rc<<endl; //fehler return 1; //fehler } else { cout<<"Winsock gestartet!"<<endl; } } };
this ist ein
Zeiger
- das heißt, dass du this-> schreiben musst - aber du kannst es auch einfach weglassen...Wie wärs mit so was:
(Ws2_32.lib nicht vergessen!)/*TODO: 1. SetIP (ip) und SetIP (url) 2. Connect 3. Empfangen (vll in nen Thread auslagern) 4. ErrorCodes in Exceptions umwandeln! */ class TSocket { private: SOCKET socket_number; public: TSocket () : socket_number (SOCKET_ERROR) { WSADATA wsaData; WSAStartup (MAKEWORD (2,2), &wsaData); }; };
In der offline-MSDN folgende Seiten: (würd ich so und so jedem empfehlen, die zu installieren...)
- WSAStartup function [Winsock]
- connect function [Winsock]
- Übersicht über Socketprogrammierung
- recv + send function [Winsock]
- _beginthreadex function
Lass mich raten: In deiner Freizeit schimpfst du über Windows, nennst es prizipiell Windoof und meckerst über Microsoft, so oft sich die Gelegenheit bietet, bist ein opensource-Fan, magst Linux etc?
Das ist sooo typisch... Ich habe keine 5 Minuten gebraucht, um dir die Artikel aus der MSDN zu suchen...Ich hätt auch in der online-MSDN suchen können, aber dann würdest du ja noch belohnt werden, für dein <ich bin zu doof google zu benutzten und mecker einfach alle voll, die mir nicht sofort die Lösung für mein Problem geben>
hf... bb
-
Da liegst du leider falsch...
Ich nutze Windows Vista, schimpfe so oft es geht über Linux, weil man ewig und 3 tage braucht um was sinnvolles zu installieren (bzw ich nicht gebacken bekomme).Was php angeht: <?php ?> oder <?= ?>
Je nach dem was man vor hat. In Java schreibt man nun mal this.
Aber hauptsache überheblich über die user fluchen, weil man ja ach so toll ist
aber es nicht auf die reihe bekommt etwas sachlich angemessen und verständlich zu erklären.Was das rc angeht... auch mit this->rc hats nicht geklappt.
Aber seit ich die funktion startWinsock() auch hinzugefügt habe funktioniert es.
Das ganze dingen ist jetzt in einer Klasse, die aber genausogut keine sein könnte.Was dieses Thema angeht...
Hier steht auf 3 seite FAST keine einzige für einen anfänger sinnvolle info.
Überall steht msdn, was man selber ja nicht findet... *ACHTUNG IRONIE*Und ich weiß, jetzt ist der arme user wieder der böse, der ja ach so unverschähmte fragen stellt...
So... Ich denke der/die richtigen fühlen sich schon angesprochen
so long
SqwanEDIT: Die alte Kuh so schnell vergisst, dass sie selbst mal Kalb gewesen ist
-
boar...
huch... da kommen ja gleich wahnsinnig viele echt nützliche ergebnisse - haben wir da was falsch gemacht? Oo
myself schrieb:
WSAStartup function [Winsock]
connect function [Winsock]
Übersicht über Socketprogrammierung
recv + send function [Winsock]
_beginthreadex functionich hab extra GANZ GENAU geschrieben, wonach du googlen musst...
Die alte Kuh so schnell vergisst, dass sie selbst mal Kalb gewesen ist
Hmm... Und ich hab (damals) niemanden gebraucht, der google für mich bedient - wenn das Kalb nicht weiß, wie es isst, dann wird es auch sterben und keine (alte) kuh werden... wenn du dich gegen jegliche eigeninitiative wehrst, dann wirst auch du kein programm schreiben können...
und evtl solltest du mal über meinen klasen-vorschlag nachdenken - wenn ich deinen post so lese, wirst du ja so was haben:
class asd { public: //private is ja eh doof... /*alle variablen, die man iwo man bekommt*/ /*funktionen - aber nicht logisch geordnet sondern um die jeweilige winapi-funktion drum rum*/ }
funktionen sollten immer nur eine bestimmte aufgabe übernehmen... die ausgabe bei nem fehler gehört dort gar nicht mehr mit rein...
So in etwa stell ich mir so ne Klasse vor...
int main () { tcp::clientsocket beispiel; beispiel.SetIP ("c-plusplus.net"); beispiel.SetPort (80); beispiel.Connect (); /*ich würd ne exception werfen (try/catch), aber du kannst auch nen bool zurückgeben (if (!Connect ()) std::cerr << "Fehler bla" << std::endl;*/ beispiel.Send (MakeHTMLheader (/*parameter*/)); std::string seite = beispiel.GetAllWithBlocking (); /*soll andeuten, dass keine Threads verwendet werden...*/ beispiel.Disconnect (); std::cout << seite << sd::endl; }
bb
-
Danke... Sowas empfinde ich als eine Hilfe, die man umsetzen kann.
Also. So in etwa wie es bei dir aussieht habe ich es schon.
Meine Variablen sind alle in Private:
und meine Funktion SetIP, da diese auschließlich von der Klasse genutzt wird.
Das kann ich aber auch noch abändern. dann kann ich sie wieder benutzen (was ja auch der sinn ist).Meine Fehlerausgabe ist zur Zeit in der Verarbeitung. Das werde ich ändern.
Meine Funktionsnamen entsprechen nicht ganz den deinen.
Ist aber durchaus sinnvoll: werde ich also übernehmen.Einen constructor habe ich zur Zeit nicht. Destructor fehlt auch.
Da muss ich nochmal in meinem Buch schaun wie das geht.__construct <-- So ists in PHP... Ich glaube hier wars anders.
so... nun ists das leider noch ziemlich viel C.
Jetzt ist die Frage:
Lohnt es sich das zu ändern?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)kann mir da vllt noch mal ausgeholfen werden?
-
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?