PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [C++] Admin Finder



till7
29.10.2011, 02:35
Hallo

Da ich mich seit einiger Zeit mit C++ beschäftige, wollte ich in dieser Section auch mal "probieren" etwas zu posten.

"Probieren" in dem Sinne, da ich nicht genau weiss ob der Quellcode wirklich gut ist. Darum riskiere ich es trotzdem mal.

Also das Programm liest eine Textdatei (*.txt) ein und überprüft die vorher eingegebene URL mit den in der .txt stehenden Pfade.

So z.B -> http://bild.de wird eingegeben.
Dannach wird einfach /admin, /irgenwas aus der .txt an die URL geschrieben.

Dannach wird überprüft ob der Server 200 zurück gibt (http://de.wikipedia.org/wiki/HTTP-Statuscode).

Wenn ja wird die URL ausgegeben. Am Ende wird noch eine "Statistik" angezeigt. Wiviele URL's gefunden wurden.

Also wie gesagt hier der Code. Auf konstruktive und hilfreiche Kritik bin ich immer froh ;)

Als Compiler wurde der GNU GCC verwendet und als IDE, Code::Blocks.

http://img6.imagebanana.com/img/nleolita/HolzShots.png


#include <iostream>
#include <fstream>
#include <wininet.h>

using namespace std;

bool http_request(string url){
bool erreichbar = false;

DWORD dwSize = 0;
char lpOutBuffer[4];

HINTERNET hRootHandle, hOpenUrlHandle;
hRootHandle = InternetOpen(TEXT("Mozilla/5.0 (Windows NT 6.1; WOW64; rv:7.0.1) Gecko/20100101 Firefox/7.0.1"),INTERNET_OPEN_TYPE_DIRECT,NULL,NULL,0);
hOpenUrlHandle = InternetOpenUrl(hRootHandle,url.c_str(),NULL,0,INT ERNET_FLAG_RAW_DATA,0);

dwSize = sizeof(lpOutBuffer);
HttpQueryInfo(hOpenUrlHandle,HTTP_QUERY_STATUS_COD E,(LPVOID)lpOutBuffer,&dwSize,NULL);

if(strcmp(lpOutBuffer, "200") == 0){
erreichbar = true;
}else{
erreichbar = false;
}

InternetCloseHandle(hOpenUrlHandle);
InternetCloseHandle(hRootHandle);

if(erreichbar){
return true;
}else{
return false;
}
}

void admin_finder(string url,string pfad){
string line, adresse;

int gefunden = 0;
int alle = 0;

ifstream myfile(pfad.c_str());
if(myfile.is_open()){
while(myfile.good()){
getline(myfile,line);

adresse = url + line;

//Check URL
if(http_request(adresse)){
cout << "\n[OK]\t" << adresse; //Nur gefundene ausgeben
gefunden++;
}

alle++;
}

myfile.close();
}

cout << endl << endl << gefunden << " / " << alle << " URL's erreichbar" << endl;
}

int main()
{
string url, datei;

cout << "Bitte URL eingeben: ";
cin >> url;
cout << "Bitte eine Textdatei auswählen: ";
cin >> datei;

if(ifstream(datei.c_str())){
admin_finder(url,datei);
}else{
cout << "Datei konnte nicht gefunden werden ;(";
}

return 0;
}
Ihr müsst noch die libwininet.a library linken damit das Ganze funktioniert.

MfG

SolidNerd
29.10.2011, 08:58
Also ich finde dein Programm ganz gut und net . C++ ist OOP deshalb programmier bitte auch so .D.h deine 2 Funktion in eine Klasse auslagern. Desweiteren kannst du noch an der Stelle
if(erreichbar){ return true; }else{ return false; } Durch einfaches return erreichbar ersetzen. Da die Verzweigung doppelt sonst ist.Was man noch verbessern könnte wäre die erfolgreichen Seiten in eine Datei zuschreiben.

Das wars erstmal von mir.

G36KV
29.10.2011, 16:31
hier hast du Programmier-Kritik:

- Dein Code ist ein Mix zwischen C und C++, entscheide dich...
- Du prüfst die Win Api return codes nicht
- Deine Variablen-Deklarationen ähneln C-Style, aber der ist nicht konsequent umgesetzt
- Du solltest immer mit symbolischen Konstanten arbeiten (HTTP_STATUS_OK)
- Weisst du überhaupt was das TEXT() Macro macht? Das hast du auch nicht konsequent umgesetzt. Entweder überall für unicode support oder gar nicht.

inout
29.10.2011, 17:22
Noch ein paar Verbesserungsvorschläge zum Programmdesign:
Ich würde in der Funktion http_request den Status-Code als Rückgabewert nehmen und dann mit einem Array von Status-Codes vergleichen (evtl. auch noch 301, 302 und 401 und 403 usw. prüfen).
HttpQueryInfo kannst Du als Buffer auch ein DWORD übergeben, dann fällt der Stringvergleich weg.
Die cout-Ausgaben sollten nicht überall im Programm verteilt sein, am besten nur im Hauptprogramm, in diesem Fall könnte man es aber auch mit einer Callback-Funktion o.Ä. machen.
Das Prüfen, ob die Datei existiert, kann die Funktion admin_finder z.B. per Rückgabewert übernehmen.
InernetOpen würde ich nur einmal aufrufen und dann mit dem Handle im ganzen Programm weiterarbeiten.

Für ein solches kleines Tool ist das aber natürlich alles ziemlich egal ;)