如何获得下一个IP地址?

Ant*_*unt 4 ip go

我正在考虑打电话net.IP.String(), strings.Split(ip, ".")一些代码来计算所有角落的情况,最后net.ParseIP(s).有更好的方法吗?下面是我当前实现的代码(没有处理特殊情况).

package main

import (
    "fmt"
    "net"
    "strconv"
    "strings"
)

func main() {
    ip := net.ParseIP("127.1.0.0")
    next, err := NextIP(ip)
    if err != nil {
        panic(err)
    }
    fmt.Println(ip, next)
}

func NextIP(ip net.IP) (net.IP, error) {
    s := ip.String()
    sa := strings.Split(s, ".")
    i, err := strconv.Atoi(sa[2])
    if err != nil {
        return nil, err
    }
    i++
    sa[3] = strconv.Itoa(i)
    s = strings.Join(sa, ".")
    return net.ParseIP(s), nil
}
Run Code Online (Sandbox Code Playgroud)

Jim*_*imB 7

只需增加IP地址中的最后一个八位字节

ip := net.ParseIP("127.1.0.0")
// make sure it's only 4 bytes
ip = ip.To4()
// check ip != nil
ip[3]++  // check for rollover
fmt.Println(ip)
//127.1.0.1
Run Code Online (Sandbox Code Playgroud)

然而,这在技术上是不正确的,因为127.1.0.1/8子网中的第一个地址是127.0.0.1.要获得真正的"第一"地址,您还需要一个IPMask.由于您没有指定一个,因此您可以将DefaultMask用于IPv4地址(对于IPv6,您不能假设掩码,并且必须提供它).

http://play.golang.org/p/P_QWwRIBIm

ip := net.IP{192, 168, 1, 10}
ip = ip.To4()
if ip == nil {
    log.Fatal("non ipv4 address")
}

ip = ip.Mask(ip.DefaultMask())
ip[3]++

fmt.Println(ip)
//192.168.1.1
Run Code Online (Sandbox Code Playgroud)