IP地址从maxAddress开始

时间:2018-12-03 23:04:33

标签: go

我需要在哪里开始生成IP地址 给定一个CIDR和一些缓存的地址。 我在这里做字节的一些代码。与存储 地址,仅选择更大的地址。

https://play.golang.org/p/yT_Mj4fR_jK

这是怎么回事?基本上我需要所有地址 来自“ 62.76.47.12/28”中的“ 62.76.47.9”。生成IP 在给定的CIDR范围内是众所周知的。

谢谢。

2 个答案:

答案 0 :(得分:0)

如果打印ìpMax,您将看到其基础表示使用16个字节。 (另请参见docs

fmt.Printf("'%#v'\n",ipMax)

'net.IP{0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0xff, 0xff, 0x3e, 0x4c, 0x2f, 0x9}'

您可以将ipMax转换为IPv4表示形式以获得所需的结果:

ipMax := net.ParseIP("62.76.47.9").To4()

答案 1 :(得分:0)

此示例将打印从第一个地址62.76.47.12/28到62.76.47.9的地址。

游乐场:https://play.golang.org/p/MUtbiKaQ_3-

package main

import (
    "fmt"
    "net"
)

func main() {
    cidr := "62.76.47.12/28"
    _, ipnet, _ := net.ParseCIDR(cidr)
    ipFirst := ipnet.IP
    ipFirstValue := toHost(ipFirst)

    ipLast := net.ParseIP("62.76.47.9")
    ipLastValue := toHost(ipLast)

    fmt.Println("cidr:  ", cidr)
    fmt.Println("first: ", ipFirst)
    fmt.Println("last:  ", ipLast)

    if ipLastValue < ipFirstValue {
        fmt.Println("ugh")
        return
    }

    for i := ipFirstValue; i < ipLastValue; i++ {
        addr := toIP(i)
        fmt.Println(addr)
    }
}

func toHost(ip net.IP) uint32 {
    i := ip.To4()
    return uint32(i[0])<<24 + uint32(i[1])<<16 + uint32(i[2])<<8 + uint32(i[3])
}

func toIP(v uint32) net.IP {
    v3 := byte(v & 0xFF)
    v2 := byte((v >> 8) & 0xFF)
    v1 := byte((v >> 16) & 0xFF)
    v0 := byte((v >> 24) & 0xFF)
    return net.IPv4(v0, v1, v2, v3)
}