C++ Von- Bis IP Adresse zählen



  • int main()
    {
       int start[4]={192,168,0,0};
       int ende[4]={192,168,1,0};
       int i=0;
       while(true)
       {
          cout << start[0]<<"."<<start[1]<<"."<<start[2]<<"."<<start[3]<<endl;
          for(i=0;i<4&&start[i]==ende[i];i++);
          if(i==4) break;
          start[3]++;
          for(int j=3;j>0;j--)
          {
             if(start[j]>255)
             {
                start[j]=0;
                start[j-1]++;
             }
          }
       }
       return 0;
    }
    


  • Eine IP hat 32 Bit, nicht 4*32 Bits wie bei obigem Code.

    Da du die IPs eh als DWORD vorliegen hast, wenn du mit der WinAPI programmierst, kannst du durch einfaches Inkrementieren alle IPs durchzählen.

    Dann musst du nur noch kurz testen, ob die IP gültig, also nicht x.x.x.0 oder x.x.x.255, ist:

    for(DWORD ip = start_ip; ip != stop_ip; ++ip)
    {
      if(valid_ip(ip))
      {
        scan(ip);
      }
    }
    


  • Eine IP hat 32 Bit, nicht 4*32 Bits wie bei obigem Code.

    ??????????????????????????????????????????
    Bei mir auch ........



  • cd9000 schrieb:

    Eine IP hat 32 Bit, nicht 4*32 Bits wie bei obigem Code.
    ...

    Er hat nicht wie du die Bitrepraesentation zum Testen der Range genutzt, sondern
    die "Human-readable"-Version :).

    mfg
    v R



  • Vielen Dank für eure Mühe, ich werde mich mal ans letzte Beispiel wagen und poste was bei rausgekommen ist, mal schauen wie ich die Funktion "validIP" schreiben werde, ich halte euch auf dem laufenden, wer mehr zum Thema wissen möchte kann eine mail an seaydv@web.de schicken,

    Gruss David



  • Habe jetzt folgendes:

    String ipstart,ipend;
      unsigned int a,b;
    
      TIniFile *ip;
      ip = new TIniFile("IP.ini");
      ipstart = ip->ReadString("Von IP","IP","");
      ipend = ip->ReadString("Bis IP","IP","");
    
      a = StrToInt(ipstart);
      b = StrToInt(ipend);
    
      for(DWORD ip = a; ip != b; ++a)
    {
    
      ClientSocket1->Address = ip;
      ClientSocket1->Active;
      ClientSocket1->Open();
    
    }
    

    Es lässt sich Kompilieren,aber ich bekomme nen dicken Fehler. Er mekkert das z.B 192.168.6.1 kein gültiger Integer Wert ist, halt wegen der Punktnotation. Weiß jemand zufällig Rat ??



  • virtuell Realisticer schrieb:

    Er hat nicht wie du die Bitrepraesentation zum Testen der Range genutzt, sondern
    die "Human-readable"-Version 🙂

    Die "Human-readable"-Version besteht aus 4 chars. 🙂



  • Update:

    String ipstart,ipend;
      unsigned long first_ip,last_ip;
      char temp[16];
    
      TIniFile *ip;
      ip = new TIniFile("IP.ini");
      ipstart = ip->ReadString("Von IP","IP","");
      ipend = ip->ReadString("Bis IP","IP","");
    
      strcpy(temp,ipstart.c_str());
      first_ip = inet_addr(temp);
    
      strcpy(temp,ipend.c_str());
      last_ip = inet_addr(temp);
    
      for(DWORD ip = first_ip; ip != last_ip; ++first_ip)
    {
    
      ClientSocket1->Address = IntToStr(ip);
      ClientSocket1->Active;
      ClientSocket1->Open();
    
    }
    

    Was meint ihr ?



  • cd9000 schrieb:

    virtuell Realisticer schrieb:

    Er hat nicht wie du die Bitrepraesentation zum Testen der Range genutzt, sondern
    die "Human-readable"-Version 🙂

    Die "Human-readable"-Version besteht aus 4 chars. 🙂

    Das stimmt schon, aber wenn er nur die Zahlen vergleicht, isses egal ob es en
    char, int, float oder double hat, solange er sich an die Grenzen haelt und es
    duerfen natuerlich keine Gleitkommazahlen sein :D.

    Bei char ist die Grenze natuerlich schon vom Typ her gegeben :). Aber du hast
    natuerlich voellig recht.

    mfg
    v R



  • David081 schrieb:

    Update:

    String ipstart,ipend;
      unsigned long first_ip,last_ip;
      char temp[16];
    
      TIniFile *ip;
      ip = new TIniFile("IP.ini");
      ipstart = ip->ReadString("Von IP","IP","");
      ipend = ip->ReadString("Bis IP","IP","");
    
      strcpy(temp,ipstart.c_str());
      first_ip = inet_addr(temp);
    
      strcpy(temp,ipend.c_str());
      last_ip = inet_addr(temp);
    
      for(DWORD ip = first_ip; ip != last_ip; ++first_ip)
    {
    
      ClientSocket1->Address = IntToStr(ip);
      ClientSocket1->Active;
      ClientSocket1->Open();
    
    }
    

    Was meint ihr ?

    Das sieht prinzipiell gut aus, allerdings kommt ein kleines Problem beim nutzen
    der Funktion inet_addr() daher. Diese Funktion liefert als Rueckgabewert einen
    32-Bit Binaerwert zurueck. Bei einem Fehler tut sie das ebenfalls und zwar
    ueblicherweise 32 1er Bits (255.255.255.255). Das Problem ist, dass dies eine
    gueltige Adresse ist (IPv4 eingeschraenkte Broadcastadresse). Du kannst also
    diese Adresse nicht mit inet_addr() verwenden, da nicht klar ist ob es ein
    Fehler darstellt oder nicht. Es koennte auch sein, dass inet_addr() bei einem
    Fehler 32 0-Bits zurueckgibt (0.0.0.0) auch dies ist eine gueltige Adresse
    (die Catch-All-Address). Unter Linux/Unix gibt es daher die neue Funktion
    inet_pton() bzw. inet_ntop(). Ich kann dir allerdings nicht sagen ob es die
    auch unter Windows gibt. Am besten du schaust mal in der Doku nach.

    mfg
    v R



  • Vielen Dank, das IP zählen läuft wie am Schnürchen ! 😃

    Habe jetzt folgendes Problem:

    ClientSocket1->Address = String(ipresult);
    ClientSocket1->Open();
    

    Mit was kann ich Haargenau überprüfen ob ein Connect zum server erfolgreich war oder nicht, bei erfolg hole ich die IP mit:

    ListBox1->Items->Append(ClientSocket1->Address);
    

    Ich habe das Erreignis OnConnect und OnError versucht aber leider ohne Erfolg, hat jemand ne Ahnung ?


Anmelden zum Antworten