# IP Bereich durchlaufen



## Mc Noise (5. Apr 2010)

Hi Leute,

ich stehe vor dem Problem, dass für einen gegebenen IP Bereich jede mögliche IP Adresse als String brauche. Dabei hatte ich an eine funktion gedacht, wo ich die Start IP und die End IP als String reingebe und den gesamten Berich in einer ArrayList bekomme. Muss so nicht sein, kann auch gerne anders gelöst werden. Wichtig ist nur, jede IP als String zu bekommen.

Bsp.:

IP Bereich: 172.16.10.1   bis   172.18.0.254

Raus kommen soll eine Liste mit:

172.16.10.1 ... 172.16.10.254
172.16.11.1 ... 172.16.11.254
172.16.12.1 ... 172.16.12. 254
...
172.17.0.1 ... 172.17.0.254
172.17.1.1 ... 172.17.1.254
172.17.2.1 ... 172.17.2.254
...
172.18.0.1 ... 172.18.0.254

Das Prinzip ist soweit klar denke ich. Man müsste jeweils das letzte Oktett auffüllen bis 254 (255) und dann das vorherige um 1 erhöhen. Hat so etwas schon mal jemand gemacht? Kann mir nicht vorstellen, dass ich der erste bin.

Danke!


----------



## Quurks (5. Apr 2010)

Ich würde das in etwa so machen:

```
//Startadresse einlesen und an Punkten trennen=> int s1,s2,s3,s4  zb für 172.17.10.20 s1=172 s2=17...
//Endadresse nach gleichem Schema in e1,e2....
for(int i1=s1;i1<=e1;i1++){
      for(int i2=s2;i2<=e2;i2++){
            for(int i3=s3;i3<=e3;i3++){
                  for(int i4=s4;i4<=e4;i4++){
                        String ip=i1+"."+i2+"."+i3."."+i4;
                        System.out.println(ip);
                  }
            }
      }
}
```

Sollte in etwa funktionieren, habs allerdings nicht getestet


----------



## Mc Noise (5. Apr 2010)

Hi Quurks,

daran hatte ich auch schon gedacht, bin aber auf ein Problem gestoßen. Wenn ein End-Oktett höher ist als das Start-Oktett, ist das kein Problem. Dann kann das in einer for Schleife durchlaufen werden.
Wenn aber ein Start-Oktett höher ist als das zugehörige End-Oktett, tirfft z.B. s3 <= e3 ja nicht mehr zu. Wäre z.B. bei diesem IP Bereich ein Problem:

172.16.10.0   bis   172.17.5.254

Zwar wären s1 <= e1 und s2 <= e2, aber s3 wäre ja schon größer und ich würde nicht in die for Schleife kommen. Das müsste als wieder in einem extra Block abgefangen werden und innerhalb dieses extra Blocks müsste ich dann ja s4 und e4 noch mal behandeln. Das Ganze wiederum müsste in jedem Oktett für jedes Unter-Oktett gemacht werden. Da wirds aber schon recht komplex. Hatte gehofft, das geht irgendwie einfacher.


----------



## HoaX (5. Apr 2010)

Machs dir halt einfach: Eine IPv4 sind nur 4 Bytes, also ein Int. Du erstellst dir einfach einen Int damit, dann inkrementierst du den. Und zur Ausgabe zerlegst du ihn wieder in die 4 Bytes. Dafür brauchst du keine 4 geschachtelten Schleifen und es funktioniert


----------



## Mc Noise (5. Apr 2010)

Das hört sich gut an (und einfach ;-) ). Hättest du evtl. noch mal ein Stück Beispielcode dazu? Wäre echt hilfreich!

Danke!!


----------



## HoaX (5. Apr 2010)

Könnte ich, aber möchte ich nicht, ist ja deine Aufgabe, und du willst was lernen(unterstelle ich jetzt einfach mal). 

Zerlegen und zusammensetzen geht mit den Bitoperatoren. Das einfach bei Google eingeben. Aber auch mit trivialer Mathematik und Modulo bekommt man das hin, einfach mal weng den Kopf anstrengen.


----------



## Mc Noise (6. Apr 2010)

Klar will ich auch was lernen ;-)

Hab mir jetzt über die Bitoperatoren einen Integer für die Start IP und einen für die End IP erzeugt. Wieder zusammensetzten klappt auch. Würde das dann jetzt in einer for Schleife durchlaufen. Stehe nur vor dem Problem, dass ich bei größeren IP Bereichen ja im Minusbereich lande. Hast du evtl. einen Tipp, wie ich das dann geschickt lösen kann? Ansonsten nehme ich einen long um im positiven Bereich zu bleiben.


----------



## Mc Noise (6. Apr 2010)

Habs jetzt einfach über einen long realisiert. Dake für eure Hilfe!!!


----------

