• 源码 判断IP 、CIDR


    Go/src/net/ip.go

    // ParseIP parses s as an IP address, returning the result.
    // The string s can be in IPv4 dotted decimal ("192.0.2.1"), IPv6
    // ("2001:db8::68"), or IPv4-mapped IPv6 ("::ffff:192.0.2.1") form.
    // If s is not a valid textual representation of an IP address,
    // ParseIP returns nil.
    func ParseIP(s string) IP {
    for i := 0; i < len(s); i++ {
    switch s[i] {
    case '.':
    return parseIPv4(s)
    case ':':
    return parseIPv6(s)
    }
    }
    return nil
    }

    // Parse IPv4 address (d.d.d.d).
    func parseIPv4(s string) IP {
    var p [IPv4len]byte
    for i := 0; i < IPv4len; i++ {
    if len(s) == 0 {
    // Missing octets.
    return nil
    }
    if i > 0 {
    if s[0] != '.' {
    return nil
    }
    s = s[1:]
    }
    n, c, ok := dtoi(s)
    if !ok || n > 0xFF {
    return nil
    }
    s = s[c:]
    p[i] = byte(n)
    }
    if len(s) != 0 {
    return nil
    }
    return IPv4(p[0], p[1], p[2], p[3])
    }
    // IPv4 returns the IP address (in 16-byte form) of the
    // IPv4 address a.b.c.d.
    func IPv4(a, b, c, d byte) IP {
    p := make(IP, IPv6len)
    copy(p, v4InV6Prefix)
    p[12] = a
    p[13] = b
    p[14] = c
    p[15] = d
    return p
    }

    // ParseCIDR parses s as a CIDR notation IP address and prefix length,
    // like "192.0.2.0/24" or "2001:db8::/32", as defined in
    // RFC 4632 and RFC 4291.
    //
    // It returns the IP address and the network implied by the IP and
    // prefix length.
    // For example, ParseCIDR("192.0.2.1/24") returns the IP address
    // 192.0.2.1 and the network 192.0.2.0/24.
    func ParseCIDR(s string) (IP, *IPNet, error) {
    i := bytealg.IndexByteString(s, '/')
    if i < 0 {
    return nil, nil, &ParseError{Type: "CIDR address", Text: s}
    }
    addr, mask := s[:i], s[i+1:]
    iplen := IPv4len
    ip := parseIPv4(addr)
    if ip == nil {
    iplen = IPv6len
    ip = parseIPv6(addr)
    }
    n, i, ok := dtoi(mask)
    if ip == nil || !ok || i != len(mask) || n < 0 || n > 8*iplen {
    return nil, nil, &ParseError{Type: "CIDR address", Text: s}
    }
    m := CIDRMask(n, 8*iplen)
    return ip, &IPNet{IP: ip.Mask(m), Mask: m}, nil
    }
  • 相关阅读:
    云计算的三种服务模式:IaaS, PaaS, SaaS
    Docker 容器备份例子
    软件版本号
    git 命令小总结
    【Oracle】ORA-12560: TNS: 协议适配器错误
    【VMware】The VMX process exited permaturely
    Linux(CentOS)安装SQL Server
    Linux源码编译安装httpd
    Linux安装MySQL
    Linux安装Tomcat
  • 原文地址:https://www.cnblogs.com/rsapaper/p/15509144.html
Copyright © 2020-2023  润新知