27

Go/GoLang で、IP アドレスが特定の範囲内にあるかどうかを確認する最速の方法は何ですか?

たとえば、 から までの範囲が指定216.14.49.184され216.14.49.191た場合、指定された入力 IP アドレスがその範囲内にあるかどうかを確認するにはどうすればよいでしょうか?

4

7 に答える 7

40

IP アドレスは go (タイプ) では bigendian[]byteスライスとして表されるIPため、 を使用して正しく比較されbytes.Compareます。

例 (遊び)

package main

import (
    "bytes"
    "fmt"
    "net"
)

var (
    ip1 = net.ParseIP("216.14.49.184")
    ip2 = net.ParseIP("216.14.49.191")
)

func check(ip string) bool {
    trial := net.ParseIP(ip)
    if trial.To4() == nil {
        fmt.Printf("%v is not an IPv4 address\n", trial)
        return false
    }
    if bytes.Compare(trial, ip1) >= 0 && bytes.Compare(trial, ip2) <= 0 {
        fmt.Printf("%v is between %v and %v\n", trial, ip1, ip2)
        return true
    }
    fmt.Printf("%v is NOT between %v and %v\n", trial, ip1, ip2)
    return false
}

func main() {
    check("1.2.3.4")
    check("216.14.49.185")
    check("1::16")
}

生産する

1.2.3.4 is NOT between 216.14.49.184 and 216.14.49.191
216.14.49.185 is between 216.14.49.184 and 216.14.49.191
1::16 is not an IPv4 address
于 2013-11-09T22:42:21.003 に答える
29

これは、「net」パッケージの stdlib に、net.Contains という関数として既に含まれています。既存のコードを書き直す必要はありません。

こちらのドキュメントを参照してください。

それを使用するには、目的のサブネットを解析するだけです

network := "192.168.5.0/24"
clientips := []string{
    "192.168.5.1",
    "192.168.6.0",
}
_, subnet, _ := net.ParseCIDR(network)
for _, clientip := range clientips {
    ip := net.ParseIP(clientip)
    if subnet.Contains(ip) {
        fmt.Println("IP in subnet", clientip)
    }
}

上記のコードが意味をなさない場合は、ここにgolang play リンクがあります

于 2016-10-16T16:57:17.807 に答える
0

IPAddress Go ライブラリは、IPv4 と IPv6 の両方のアドレスを使用して、ポリモーフィックな方法でこれを迅速に行うことができます。 ここにリポジトリがあります。免責事項: 私はプロジェクト マネージャーです。

isInRange("216.14.49.184", "216.14.49.191", "216.14.49.190")
isInRange("2001:0db8:85a3::8a2e:0370:7334", "2001:0db8:85a3::8a00:ff:ffff",
    "2001:0db8:85a3::8a03:a:b")

func getAddress(str string) *ipaddr.IPAddress {
    return ipaddr.NewIPAddressString(str).GetAddress()
}

func isInRange(range1Str, range2Str, addrStr string) {
    range1, range2, addr :=
        getAddress(range1Str), getAddress(range2Str), getAddress(addrStr)
    rng := range1.SpanWithRange(range2)
    result := rng.Contains(addr)
    fmt.Printf("%v contains %v %t\n", rng, addr, result)
    return
}

出力:

216.14.49.184 -> 216.14.49.191 contains 216.14.49.190 true
2001:db8:85a3::8a00:ff:ffff -> 2001:db8:85a3::8a2e:370:7334 contains 2001:db8:85a3::8a03:a:b true
于 2022-01-15T02:32:23.533 に答える