golangでnetwork programmingしてみた

golangでnetwork programmingするにあたって

go version : 1.8

os : kubuntu 16

やったこと

  1. IPアドレスのパース
  2. IPMask

IPアドレスのパース

文字列のIPアドレスをパースして[]byte(IP型)へ変換する。 使ったメソッド

net.ParseIP(ip string) IP

文字列はIPv4の場合はどっと区切りに、IPv6の場合はコロン区切りになっていること。

もし、パースできなかった場合は、返り値としてnilが返ってくる。

exsample

func main() {
    addr := net.ParseIP("127.0.0.1")
    if addr == nil {
        fmt.Printf("invalid address \n")
    } else {
        fmt.Printf("address is %s \n", addr.String())
    }
}

IP型はnetパッケージで使用するいろんなメソッドで使用することになるので、パースの仕方を覚えてると便利

IPMask

次は、IPアドレスのマスク処理。

ネットワークのプレフィックスを指定して、ネットワークアドレスを取得するところまで。

使ったメソッド

net.CIDRMask(ones, bits int) IPMask
(ip IP)Mask(mask IPMask) IP

CIDRMaskでIPMaskの作成。onesはプレフィックス長かな、bitsはトータルのビット数。

Maskメソッドで実際にIPアドレスをマスクする。

exsample

func main() {
    addr := net.ParseIP("192.168.11.101")
    ones := 24
    bits := 32
    mask := net.CIDRMask(ones, bits)
    network := addr.Mask(mask)
    fmt.Printf("Address is %s \nMask length is %d \nLeading ones is %d \nMask is (hex) %s \nNetwork is %s", addr.String(), bits, ones, mask.String(), network.String())
}

IPMaskを作る方法は別にもある。

net.IPv4Mask(a, b, c, d byte) IPMask

aからdへそれぞれ、IPv4のオクテットに対応するようにマスクする

exsample

mask := net.IPv4Mask(255, 255, 255, 0)

IPv4に限って、デフォルトのIPMaskを種痘することもできる(クラス単位でかな)

(ip IP) DefaultMask() IPMask

IPのデフォルトのマスクを取得

exsample

addr := net.ParseIP("192.168.11.101")
mask := addr.DefaultMask()