type IP []byte
在 net 包中,有幾個函數可以將 IP 地址型別作為函數的返回型別,比如 ParseIP() 函數,該函數原型定義如下:func ParseIP(s string) IP
ParseIP() 函數的主要作用是分析 IP 地址的合法性,如果是一個合法的 IP 地址,ParseIP() 函數將返回一個 IP 地址物件。如果是一個非法 IP 地址,ParseIP() 函數將返回 nil。func (ip IP) String() string
如果是 IPv4 地址,String() 方法將返回一個點分十進位制格式的 IP 地址,如“192.168.0.1”。如果是 IPv6 地址,String() 方法將返回使用“:”分隔的地址形式,如“2000:0:0:0:0:0:0:1”。另外注意一個特例,對於地址“0:0:0:0:0:0:0:1”的返回結果是省略格式“::1”。import( "fmt" "net" "os" ) func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s ip.addrn", os.Args[0]) os.Exit(1) } addr := os.Args[1] ip := net.ParseIP(addr) if ip == nil { fmt.Println("Invalid address") } else { fmt.Println("The address is", ip.String()) } os.Exit(0) }編譯並執行該程式,測試過程如下:
從鍵盤輸入:192.168.0.1
輸出結果為:The address is 192.168.0.1
從鍵盤輸入:192.168.0.256
輸出結果為:Inval id address
從鍵盤輸入:0:0:0:0:0:0:0:1
輸出結果為:::1
type IPMask []byte
函數 IPv4Mask() 可以通過一個 32 位 IPv4 地址生成子網掩碼地址,呼叫成功後返回一個 4 位元組的十六進位制子網掩碼地址。IPv4Mask() 函數原型定義如下:func IPv4Mask(a, b, c, d byte) IPMask
另外,還可以使用主機地址物件的 DefaultMask() 方法獲取主機預設子網掩碼地址,DefaultMask() 方法原型定義如下:func (ip IP) DefaultMask() IPMask
要注意的是,只有 IPv4 地址才有預設子網掩碼。如果不是 IPv4 地址,DefaultMask() 方法將返回 nil。不管是通過呼叫 IPv4Mask() 函數,還是執行 DefaultMask() 方法,獲取的子網掩碼地址都是十六進位制格式的。例如,子網掩碼地址“255.255.255.0”的十六進位制格式是“ffffffOO”。func (ip IP) Mask(mask IPMask) IP
還可以通過子網掩碼物件的 Size() 方法獲取掩碼位數 (ones) 和掩碼總長度 (bits),如果是一個非標準的子網掩碼地址,則 Size() 方法將返回“0,0”。Size() 方法的原型定義如下:func (m IPMask) Size() (ones, bits int)
【範例 2】子網掩碼地址。// 子網掩碼地址 package main import( "fmt" "net" "os" ) func main() { if len(os.Args) != 2 { fmt.Fprintf(os.Stderr, "Usage: %s ip.addrn", os.Args[0]) os.Exit(1) } dotaddr := os.Args[1] addr := net.ParseIP(dotaddr) if addr == nil { fmt.Println("Invalid address") } mask := addr.DefaultMask() fmt.Println("Subnet mask is: ", mask.String()) network := addr.Mask(mask) fmt.Println("Network address is: ", network.String()) ones, bits := mask.Size() fmt.Println("Mask bits: ", ones, "Total bits: ", bits) os.Exit(0) }編譯並執行該程式,結果如下所示:
PS D:code> go run .main.go 192.168.0.1
Subnet mask is: ffffff00
Network address is: 192.168.0.0
Mask bits: 24 Total bits: 32
type IPAddr struct {
IP IP
)
func ResolveIPAddr(net, addr string) (*IPAddr, error)
在呼叫 ResolveIPAddr() 函數時,引數 net 表示網路型別,可以是“ip”、“ip4”或“ip6”,引數 addr 可以是 IP 地址或域名,如果是 IPv6 地址則必須使用“[]”括起來。ResolveIPAddr() 函數呼叫成功後返回指向 IPAddr 結構體的指標,呼叫失敗返回錯誤型別 error。// DNS 域名解析 package main import( "fmt" "net" "os" ) func main() { if len(os.Args) != 2{ fmt.Fprintf(os.Stderr, "Usage: %s hostnamen", os.Args[0]) fmt.Println("Usage: ", os.Args[0], "hostname") os.Exit(1) } name := os.Args[1] addr, err := net.ResolveIPAddr("ip", name) if err != nil { fmt.Println("Resolvtion error", err.Error()) os.Exit(1) } fmt.Println("Resolved address is", addr.String()) os.Exit(0) }編譯並執行該程式,結果如下所示:
PS D:code> go run .main.go c.biancheng.net
Resolved address is 61.240.154.117