IP-Adresse/Domains validieren



  • Hallo Community,

    ich schreibe ein kleines Programm zur Verfügbarkeitsprüfung von Webservern.
    Das Programm liest aus einer Datei alle Adressen aus. In der DAtei können aber auch andere Sachen stehen, z.B. Kommentare. Nun soll es alle gültigen IP-Adressen/Domainnamen finden.

    Die Adresse haben immer das Format "<Host>:<Port>".

    Wie kann ich das am besten bewerkstelligen?



  • wenn es webserver sind, einfach nen GET auf alle werfen
    also sowas wie ne Liste von webservern sichern

    struct sServer
    {
       char *servername;
       char  port;
    }
    

    und dann einfach aus der Datei lesen..
    Anschließend in einer Schleife alle abfragen..



  • Das ist nichtt mein Problem.
    Ich möchte aus der Datei alle Server-Adressen auslesen. Aber wie schaffe ich, dass Kommentare etc. nicht als Adresse erkannt werden.

    In der Datei steht z.B. sowas:

    1.1.1.1:1 bla muh
    2.2.2.2:2 "§$%&
    www.domain.de:123 abc123
    

    bla, muh und abc123 könnten theoretisch auch Hostnamen sein aber die einfachen sind in meinem Fall nicht relevant.

    Es müssen also alle Strings im Format "<zahl>.<zahl>.<zahl>.<zahl>:<zahl>" und "<buchstaben>:<zahl>" (und die ganzen anderen möglichen Domain-Namen-Zeichen) erkannt werden.

    Ich habe ein ähnliches Programm schon in PHP geschrieben. Da mache ich es einfach per preg_match() (Reguläre Ausdrücke). So kompliziert wollte ich es in C++ aber nicht unbedingt.



  • wenn du schon ne Regex genommen hast , was spricht dann gegen boost::regex ?
    damit lässt sich das denke ich auch ganz nett lösen; kompliziert ist es in meinen Augen nicht ungedingt aber okay, du wirst deine Gründe haben



  • Ja, kompliziert ist es nicht aber ich halte den Aufwand dafür zu groß.
    Es scheint ja keiner eine andere Idee zu haben, also werde ich das mal mit regex machen.



  • Ich habe es jetzt doch durch eigenen Code gelöst.

    Falls es jemanen interessiert, so mache ich es:

    20 struct proxyaddr {
         21     string host;
         22     string port;
         23 };
    
         34     char chr;
         35     vector<proxyaddr> proxylist;
         36     struct proxyaddr proxy;
         37     int ippos = 0;
         38     bool isport = false;
         39     while((chr = fgetc(file)) != EOF)
         40     {
         41         if((int)chr >= 48 and (int)chr <= 57)   // 0-9
         42         {
         43             if(isport)
         44             {
         45                 proxy.port += chr;
         46             }
         47             else
         48             {
         49                 proxy.host += chr;
         50             }
         51         }
         52         else if((int)chr == 46)     // .
         53         {
         54             if(ippos <= 3)
         55             {
         56                 proxy.host += chr;
         57                 ippos++;
         58             }
         59             else
         60             {
         61                 proxy.host = "";
         62                 ippos = 0;
         63             }
         64         }
         65         else if((int)chr == 58)     // :
         66         {
         67             if(ippos == 3)
         68             {
         69                 isport = true;
         70             }
         71         }
         72         else
         73         {
         74             isport = false;
         75             if(ippos == 3 and proxy.port.length() > 0)
         76             {
         77                 proxylist.push_back(proxy);
         78                 proxy.host = "";
         79                 proxy.port = "";
         80                 ippos = 0;
         81             }
         82         }
         83     }
    

    In proxylist stehen dann alle IPs und Ports als Strings.



  • Warum parst du nicht jede Zeile bis zum Leerzeichen bzw. Tabulator?
    (Diese können ja nicht Teil eines Namens sein!)
    Warum kompliziert, wenn's auch einfach geht...



  • Das lesen einzelner Zeichen von Platte ist mächtig langsam. Würde ich auch ganze Zeilen lesen. Am besten aber noch die ganze Datei in einem Rutsch lesen und dann im std::string durch iterieren... da könnteste ohne Probs jedes einzelne Zeichen überprüfen.

    Ansonst aber schon gut, das man hier im Forum ein Posting sieht in dem nicht mit char-Arrays gearbeitet wird.


Anmelden zum Antworten