Ergebnis 1 bis 4 von 4
  1. #1
    Capt'n Crunch Avatar von till7
    Registriert seit
    10.07.2008
    Beiträge
    995

    Standard [C++] Admin Finder

    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.



    Code:
    #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,INTERNET_FLAG_RAW_DATA,0);
    
        dwSize = sizeof(lpOutBuffer);
        HttpQueryInfo(hOpenUrlHandle,HTTP_QUERY_STATUS_CODE,(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
    gestohlen.

  2. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    Rastajan (29.10.2011)

  3. #2
    Anfänger Avatar von SolidNerd
    Registriert seit
    17.10.2011
    Beiträge
    13

    Standard

    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.

  4. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    till7 (29.10.2011)

  5. #3
    NoClose Wurm
    Registriert seit
    21.03.2008
    Beiträge
    196

    Standard

    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.

  6. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    till7 (29.10.2011)

  7. #4

    Registriert seit
    17.06.2009
    Beiträge
    559

    Standard

    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

  8. Folgende Benutzer haben sich für diesen Beitrag bedankt:

    till7 (29.10.2011)

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •