golangでnetwork programmingしてみた
golangでnetwork programmingするにあたって
go version : 1.8
os : kubuntu 16
やったこと
- IPアドレスのパース
- 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()