首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Python 3.3中的ip地址网络

Python 3.3中的ip地址网络
EN

Stack Overflow用户
提问于 2013-07-16 04:50:43
回答 1查看 377关注 0票数 0

我正在尝试转换一组IP范围,这些IP范围可以在任何给定的地址上开始和结束,但不一定在.0、.127或.255等上。我的代码大部分都在工作;但是,对于大范围,它可能会很慢。

例如,find_range("1.40.0.0","1.44.255.255")返回1.40.0.0/141.44.0.0/16的正确结果需要一分钟以上的时间。

此外,当起始范围不是以.0结束时,我也会遇到麻烦。我如何解决这两个问题:大IP范围慢和起始范围不是以.0结束?

对于速度慢的问题,我尝试一次跳过1个以上的地址,但这样会错过较小的范围。

代码语言:javascript
复制
import ipaddress, socket, struct

def ip2int(addr):                                                               
    return struct.unpack("!I", socket.inet_aton(addr))[0]                       

def int2ip(addr):                                                               
    return socket.inet_ntoa(struct.pack("!I", addr))        

def ipminus(ip, amount=1):
    tmp = ip2int(ip)
    return int2ip(tmp - amount)

def ipplus(ip):
    tmp = ip2int(ip)
    return int2ip(tmp + 1)

def cidr_notation(a,b):
    for mask in range(32, 6, -1):
        test = "%s/%s" % (a,mask)
        try:
            n = ipaddress.IPv4Network(test,False)
            if b == "%s" % (n.broadcast_address):
                return test
        except:
            pass
    return None

def split_range(a,b):
    a1 = ip2int(a)
    b1 = ip2int(b)

    needed = 1
    while needed:
        result = cidr_notation(a,b)
        if result:
            print( "* %16s\t%16s\t%16s" % (result, a, b))
            if ip2int(b) > b1:
                needed = 0
            else:
                a = ipplus(b)
                b = int2ip(b1)
        else:
            b = ipminus(b)

    return result

def find_range(x,y):
    result = cidr_notation(x,y)
    if result:
        print( "# %16s\t%16s\t%16s" % (result, x, y))
    else:
        split_range(x,y)

# main...
print("%16s\t%16s\t%16s" % ("mask","start","end"))
print("%16s\t%16s\t%16s" % ("----","-----","---"))

find_range("128.191.0.0","128.191.255.255") #fast
find_range("10.55.96.106","10.55.96.106") #fast
find_range("5.135.14.0","5.135.61.11") #slow
find_range("4.31.64.72","4.59.175.255") #does not work, how to fix?
find_range("1.40.0.0","1.44.255.255") #very slow
# 5000 more find_range() calls...
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-07-16 21:32:57

基于bsdlp的注释,这段代码变得更简单、更快!

代码语言:javascript
复制
    def find_range(x,y,c_code="",c_name=""):
    print()
    print("%29s\t%23s" % (x,y))
    print("%16s\t%16s\t%16s\t%4s\t%s" % ("mask","start","end","code","name"))
    print("%16s\t%16s\t%16s\t%4s\t%s" % ("----","-----","---","----","----"))

    result = ipaddress.summarize_address_range( ipaddress.IPv4Address(x), ipaddress.IPv4Address(y) )
    for entry in result:
        net = str( entry.network_address )
        bcast = str( entry.broadcast_address )
        print( "%16s\t%16s\t%16s\t%4s\t%s" % (entry, net, bcast,c_code,c_name))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17663693

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档