IP-Range zwischen 2 IP-Adressen ermitteln



  • Hallo,

    Ich möchte gerne ein Programm schreiben, bei dem man 2 IP-Adressen in 2 TEdits eingeben kann und das dann alle IPs, die dazwischenliegen anzeigt bzw. irgendwo speichert. (Als Vorbereitung zu einem Ping Programm).
    Gibt es vielleicht schon eine vordefinierte Funktion, die so etwas oder ähnliches ermöglicht?

    Danke!



  • Zerleg dir die Strings in die vier Blöcke, vergleich die Blöcke von vorne an und guck wo die Unterschiede anfangen. (Du kannst die mittels StrToInt oder der AnsiString-Methode ToInt() angucken).

    War jetzt nur ein Ansatz wie man es machen könnte, gibt bestimmt bessere 🙂



  • Hmm... das versteh ich leider nicht ganz 🙄
    Du meinst, wenn ich dann einen Unterschied im ersten "Block" festgestellt hab, soll ich den mit allen anderen Möglichkeiten in den anderen 3 Blöcken kombinieren? 😕



  • Nein so nicht

    Bsp.:
    192.168.1.1 //1. IP
    192.168.3.1 //2. IP

    Jetzt zerlegst du beiden IPs in jeweis 4 Blöcke Bsp.:

    //1. IP 2. IP
    192     192
    168     168
    1       3
    1       1
    

    Jetzt vergleichst du die beiden ersten Blöcke, dan die beiden 2. usw. Wenn du jetzt beim 3. Vergleich bist siehst du das hier ein Unterschied ist (klar 3 > 1) also muss du jetzt den Block dahinter hochzählen (max 255), und dann den 3. Block um eins erhöhen usw. so lange bis du alle IPs durch hast und sie übereinstimmen.

    Hoffe das war jetzt etwas deutlicher 🙂 :p



  • Ah, super!
    Jetzt hab ich´s verstanden 😉
    ich hoffe nur, dass ich das ganze auch programmieren kann!
    Dir ein ganz großes Danke!! 👍 👍



  • Hallo!

    Wen´s interessiert: hier mal eine "rohe" Funktion, die die Ip-Adressen ermittelt.

    TStrings* ipRange(char* startIp, char* stopIp){
       TStringList *ipRange = new TStringList();
       if(inet_addr(startIp) == INADDR_NONE){
          ipRange = NULL;;
       }
       else{
          if(inet_addr(stopIp) == INADDR_NONE){
             ipRange = NULL;
          }
          else{
             unsigned char start[4];
             unsigned char stop[4];
             DWORD ip = inet_addr(startIp);
             in_addr ganzeStartIp;
             ganzeStartIp.S_un.S_addr = ip;
             start[0] = ganzeStartIp.S_un.S_un_b.s_b1;
             start[1] = ganzeStartIp.S_un.S_un_b.s_b2;
             start[2] = ganzeStartIp.S_un.S_un_b.s_b3;
             start[3] = ganzeStartIp.S_un.S_un_b.s_b4;
             ip = inet_addr(stopIp);
             in_addr ganzeStopIp;
             ganzeStopIp.S_un.S_addr = ip;
             stop[0] = ganzeStopIp.S_un.S_un_b.s_b1;
             stop[1] = ganzeStopIp.S_un.S_un_b.s_b2;
             stop[2] = ganzeStopIp.S_un.S_un_b.s_b3;
             stop[3] = ganzeStopIp.S_un.S_un_b.s_b4;
             DWORD anzIps =  ganzeStartIp.S_un.S_addr - ganzeStopIp.S_un.S_addr;
             while((start[0] != stop[0])){
                ipRange->Add(IntToStr(start[0]) + "." + IntToStr(start[1])+ "." + IntToStr(start[2])+ "." + IntToStr(start[3]));
                start[3]++;
                if(start[3] == 255){
                   start[3] = 1;
                   start[2]++;
                   if(start[2] == 255){
                      start[2] = 1;
                      start[1]++;
                      if(start[1] == 255){
                         start[1] = 1;
                         start[0]++;
                      }
                   }
                }
             }
             while((start[1] != stop[1])){
                ipRange->Add(IntToStr(start[0]) + "." + IntToStr(start[1])+ "." + IntToStr(start[2])+ "." + IntToStr(start[3]));
                start[3]++;
                if(start[3] == 255){
                   start[3] = 1;
                   start[2]++;
                   if(start[2] == 255){
                      start[2] = 1;
                      start[1]++;
                   }
                }
             }
             while((start[2] != stop[2])){
             ipRange->Add(IntToStr(start[0]) + "." + IntToStr(start[1])+ "." + IntToStr(start[2])+ "." + IntToStr(start[3]));
                start[3]++;
                if(start[3] == 255){
                   start[3] = 1;
                   start[2]++;
                }
             }
             while((start[3] != stop[3]+1)){
             ipRange->Add(IntToStr(start[0]) + "." + IntToStr(start[1])+ "." + IntToStr(start[2])+ "." + IntToStr(start[3]));
                start[3]++;
             }
          }
       }
       return ipRange;
    }
    

    Thx an PuppetMaster2k 🙂



  • hier noch eine kürzere variante (benötigt die math.hpp)

    TStrings* ipRange(String StartIp, String StopIp)
    { TStringList *Range = new TStringList();
      StartIp += ".";
      StopIp += ".";
    
      __int64 IP1 = 0, IP2 = 0;
      for(int i=0; i<4; i++)
       { IP1 += StrToInt(StartIp.SubString(1, StartIp.Pos(".")-1)) * Power(256, 3-i);
         StartIp.Delete(1,StartIp.Pos("."));
         IP2 += StrToInt(StopIp.SubString(1, StopIp.Pos(".")-1)) * Power(256, 3-i);
         StopIp.Delete(1,StopIp.Pos("."));
       }
    
      String IP;
      for(__int64 i=IP1; i<=IP2; i++)
       { IP = "";
         for(int j=0; j<4; j++)
          IP += IntToStr(__int64(i / Power(256, 3-j)) % 256) + String((j<3) ? "." : "");
         Range->Add(IP);
       }
      return Range;
    }
    

    die function testet noch nicht die gültigkeit der ip's, ich gehe davon aus, dass ich 2 gültige ip's übergeben bekomme

    das prinzip ist ein anderes:
    ich rechne jede ip erst in einen __int64-wert um, und lass dann eine schleife durchlaufen, die von der startip zur stopip durchläuft
    dann rechne ich nur noch in der schleife den jeweiligen wert ins ip-format zurück


Anmelden zum Antworten