zoukankan      html  css  js  c++  java
  • IP地址处理模块IPy

    IP地址规划是网络设计中非常重要的一个环节,规划的好坏会直接影响路由协议算法的效率,包括网络性能、可扩展性等方面。

    在这个过程中,免不了要计算大量的IP地址,包括网段、网络掩码、广播地址、子网数、IP类型等

    一、IP地址、网段的基本处理

    IP类常见的手段包括解析名称、IP类型、IP转化等

    In [1]: from IPy import IP
    
    In [2]: len(IP('192.168.0.0/16'))  #统计该网段的IP地址个数
    Out[2]: 65536
    
    In [3]: ip = IP("192.168.1.20")   #实例化一个IP
    
    In [4]: ip.reverseNames()   #反向解析地址格式
    Out[4]: ['20.1.168.192.in-addr.arpa.']
    
    In [5]: ip.iptype()   #私网类型
    Out[5]: 'PRIVATE'
    
    In [6]: IP("8.8.8.8").iptype()   #公网类型
    Out[6]: 'PUBLIC'
    
    In [7]: IP("8.8.8.8").int()   #转化成整形格式
    Out[7]: 134744072
    
    In [9]: IP("8.8.8.8").strHex()   #转化为十六进制格式
    Out[9]: '0x8080808'
    
    In [10]: IP("8.8.8.8").strBin()    #转化为二进制格式
    Out[10]: '00001000000010000000100000001000'
    
    In [11]: print(IP(0x8080808))  #将十六进制转化为IP格式
    8.8.8.8

    IP方法也包括网络地址的转换,例如根据IP与掩码生产网段的格式。

    In [12]: print(IP("192.168.1.0").make_net("255.255.255.0"))
    192.168.1.0/24
    
    In [13]: print(IP("192.168.1.0/255.255.255.0",make_net=True))
    192.168.1.0/24
    
    In [14]: print(IP("192.168.1.0-192.168.1.255",make_net=True))
    192.168.1.0/24

    也可以通过strNormal方法指定不同wantprefixlen参数值以定制不同输出类型的网段,输出类型为字符串。

    In [19]: IP("192.168.1.0/24").strNormal(0)  #无返回值
    Out[19]: '192.168.1.0'
    
    In [20]: IP("192.168.1.0/24").strNormal(1)  #prefix格式
    Out[20]: '192.168.1.0/24'
    
    In [21]: IP("192.168.1.0/24").strNormal(2)  #decimalnetmask格式
    Out[21]: '192.168.1.0/255.255.255.0'
    
    In [22]: IP("192.168.1.0/24").strNormal(3)  #lastIP格式
    Out[22]: '192.168.1.0-192.168.1.255'

    二、多网络计算方法

    有时候我们想比较两个网段是否存在包含、重叠关系,IPy就可以支持类似于数据类型的比较。

    In [23]: IP("192.168.1.0") < IP("192.168.1.1")
    Out[23]: True
    
    In [24]: '192.168.1.10' in IP("192.168.1.0/24")
    Out[24]: True  #IP是否包含在另一个网段中
    
    In [26]: IP("192.168.1.0/24") in IP("192.168.0.0/16")
    Out[26]: True   #网段是否包含在另一个网段中
    
    #判断两个网段是否存在重叠
    In [27]: IP("192.168.0.0/23").overlaps("192.168.1.0/24")
    Out[27]: 1  #1代表存在重叠
    
    In [28]: IP("192.168.0.0/23").overlaps("192.168.1.0")
    Out[28]: 1
    
    In [29]: IP("192.168.1.0/24").overlaps("192.168.2.0/24")
    Out[29]: 0   #0代表不存在重叠

    综合实例:根据输入的IP或子网返回网络、掩码、广播、反向解析、子网数等

    #!/usr/bin/env python
    #coding:utf-8
    from IPy import IP
    
    ip_s = raw_input("请输入一个ip或者网段:")
    ips = IP(ip_s)
    if len(ips) > 1:
        print "网络地址: %s" % ips.net()
        print "子网掩码: %s" % ips.netmask()
        print "网络广播地址 : %s" % ips.broadcast()
        print "地址反向解析: %s" % ips.reverseNames()[0]
        print "网络子网数: %s " % len(ips)
    else:
        print "IP反向解析: %s " % ips.reverseNames()[0]
    
    print "十六进制地址: %s " % ips.strHex()
    print "二进制地址: %s " % ips.strBin()
    print "地址类型: %s " % ips.iptype()

    执行结果:

    #输入一个网址
    [root@localhost script]# python ip.py 
    请输入一个ip或者网段:192.168.1.1
    IP反向解析: 1.1.168.192.in-addr.arpa. 
    十六进制地址: 0xc0a80101 
    二进制地址: 11000000101010000000000100000001 
    地址类型: PRIVATE 
    [root@localhost script]# python ip.py 
    
    #输入一个网段
    [root@localhost script]# python ip.py 
    请输入一个ip或者网段:192.168.1.0/24
    网络地址: 192.168.1.0
    子网掩码: 255.255.255.0
    网络广播地址 : 192.168.1.255
    地址反向解析: 1.168.192.in-addr.arpa.
    网络子网数: 256 
    十六进制地址: 0xc0a80100 
    二进制地址: 11000000101010000000000100000000 
    地址类型: PRIVATE 
  • 相关阅读:
    如何通过css控制内容显示顺序 第二行的内容优先显示
    《掌上流年》“国内首部微信日记”出版
    Hello Kitty微信主题很可爱?小心财产安全!
    第三方网站不能调用微信公众平台里的图片了 显示"此图片来自微信公众号平台未经允许不可引用"
    鼓浪屿船票也能用微信支付了
    excel判断单元格包含指定内容的函数用=IF(COUNTIF(A1,"*内容*"),"0","1")
    认证的政府与媒体类订阅号可取得网页授权接口了
    来八卦一下常刷微信朋友圈的你属于什么类型
    微信稳居Android App排行榜4月份国内榜首
    [福利]非认证公众帐号也能申请微信连Wi-Fi了
  • 原文地址:https://www.cnblogs.com/yangmingxianshen/p/7898172.html
Copyright © 2011-2022 走看看