[Tutor] print IP address range to stdout

Dave Angel davea at ieee.org
Tue Dec 22 12:32:09 CET 2009



MK wrote:
> Hi there,
>
> i have some logical problem. I dont get it done to write my for loops in
> that way that the ip address range which is given as arguments are
> correct processed. Meaning that only the ips are printed which the
> user defines as argument. I tried to make an if statement to stop
> at the end_adress but it didnt work as it will stop at the end range
> every time. 
>
> Here is my program so far:
>
> ---------------------------------------------------------
> sai = start_adress.split(".")
> eai = end_adress.split(".")
>
> # Prüfen auf gültige IP
> if eai < sai:
> 	help_here()
>
> #print sai,eai
>
> sa1=int(sai[0])
> sa2=int(sai[1])
> sa3=int(sai[2])
> sa4=int(sai[3])
> ea1=int(eai[0])
> ea2=int(eai[1])
> ea3=int(eai[2])
> ea4=int(eai[3])
>
> #print sa1,sa2,sa3,sa4
> #print ea1,ea2,ea3,ea4
>
> e1=ea1+1 # muß um 1 erhöht werden da sonst nur bis ea1-1
> e2=ea2+1
> e3=ea3+1
> e4=ea4+1
>
> ip=""
> for i in range(sa4,255):
> 	ip=sai[0]+"."+sai[1]+"."+sai[2]+"."+str(i)
> 	print ip
> print "-------4--------"	
> 					
> for i in range(sa3+1,255):
> 	for i2 in range(1,255):
> 		ip=sai[0]+"."+sai[1]+"."+str(i)+"."+str(i2)
> 		print ip
> print "-------3--------"		
>
> sa3=sa3+1
> for i in range(sa2+1,e2):
> 	for i2 in range(1,255):
> 		for i3 in range(1,255):
> 			ip=sai[0]+"."+str(i)+"."+str(i2)+"."+str(i3)
> 			print ip
> print "-------2--------"			
> 			
> for i in range(sa1+1,e1):
> 	for i2 in range(1,255):
> 		for i3 in range(1,255):
> 			for i4 in range(1,255):
> 				ip=str(i)+"."+str(i2)+"."+str(i3)+"."+str(i4)
> 				print ip		
> print "-------1--------"
>
> ---------------------------------------------------------
>
> The start_adress and end_adress are the ip-range.
>
> For example:
> printdomains.py -s 192.168.178.0 -e 193.170.180.4
>
> This should make all ips and stop at the end_adress.
>
> Maybe you can help.
>
> Thank you.
>
> Mac
>
>
>   
Trying to write nested loops as you have done is going to be very 
difficult, as the start and end conditions for each nested loop depends 
on the state of the outer loop.

There are several ways you could accomplish the desired loop, but the 
easiest would probably be to write two functions.  The first converts 
from the four integers in the ip address into a single, larger one.  And 
the other function converts back.  Then the main loop is simply a 
non-nested loop.

def to_integer(ip_string):
     #convert the ip string into a single 32-bit integer

def  to_string(ip_int):
     #convert the integer back into a string of four values, with 
periods between

sai = to_integer(start_address)
eai = to_integer(end_address)
for ip in xrange(sai, eai):
     result = to_string(ip)
     print result

If you need help writing the two functions, I'm sure many people here 
could help.  But try it for yourself.  Note that the int you're looking 
for in the first function will be gotten by multiplying the various 
parts of the IP address by different powers of 256.

And note that whatever valid IP address you plug into the first 
function, if you then apply the second function you should get back the 
string you started with.  So it should be easy to test while you're 
working on it.

DaveA



More information about the Tutor mailing list