Go语言获取IP地址和域名解析

主机地址是网络通信最重要的数据之一,net 包中定义了三种类型的主机地址数据类型:IP、IPMask 和 IPAddr,它们分别用来存储协议相关的网络地址。

IP 地址类型

在 net 包中,IP 地址类型被定义成一个 byte 型数组,即若干个 8 位组,格式如下:

type IP []byte

在 net 包中,有几个函数可以将 IP 地址类型作为函数的返回类型,比如 ParseIP() 函数,该函数原型定义如下:

func ParseIP(s string) IP

ParseIP() 函数的主要作用是分析 IP 地址的合法性,如果是一个合法的 IP 地址,ParseIP() 函数将返回一个 IP 地址对象。如果是一个非法 IP 地址,ParseIP() 函数将返回 nil。

还可以使用 IP 对象的 String() 方法将 IP 地址转换成字符串格式,String() 方法的原型定义如下:

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”。

【示例 1】IP 地址类型。

  1. import(
  2. “fmt”
  3. “net”
  4. “os”
  5. )
  6. func main() {
  7. if len(os.Args) != 2 {
  8. fmt.Fprintf(os.Stderr, “Usage: %s ip.addr\n”, os.Args[0])
  9. os.Exit(1)
  10. }
  11. addr := os.Args[1]
  12. ip := net.ParseIP(addr)
  13. if ip == nil {
  14. fmt.Println(“Invalid address”)
  15. } else {
  16. fmt.Println(“The address is”, ip.String())
  17. }
  18. os.Exit(0)
  19. }

编译并运行该程序,测试过程如下:

从键盘输入: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

IPMask 地址类型

在 Go语言中,为了方便子网掩码操作与计算,net 包中还提供了 IPMask 地址类型。在前面讲过,子网掩码地址其实就是一个特殊的 IP 地址,所以 IPMask 类型也是一个 byte 型数组,格式如下:

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”。

主机地址对象还有一个 Mask() 方法,执行 Mask() 方法后,会返回 IP 地址与子网掩码地址相“与”的结果,这个结果即是主机所处的网络的“网络地址”。Mask() 方法原型定义如下:

func (ip IP) Mask(mask IPMask) IP

还可以通过子网掩码对象的 Size() 方法获取掩码位数 (ones) 和掩码总长度 (bits),如果是一个非标准的子网掩码地址,则 Size() 方法将返回“0,0”。Size() 方法的原型定义如下:

func (m IPMask) Size() (ones, bits int)

【示例 2】子网掩码地址。

  1. // 子网掩码地址
  2. package main
  3. import(
  4. “fmt”
  5. “net”
  6. “os”
  7. )
  8. func main() {
  9. if len(os.Args) != 2 {
  10. fmt.Fprintf(os.Stderr, “Usage: %s ip.addr\n”, os.Args[0])
  11. os.Exit(1)
  12. }
  13. dotaddr := os.Args[1]
  14. addr := net.ParseIP(dotaddr)
  15. if addr == nil {
  16. fmt.Println(“Invalid address”)
  17. }
  18. mask := addr.DefaultMask()
  19. fmt.Println(“Subnet mask is: “, mask.String())
  20. network := addr.Mask(mask)
  21. fmt.Println(“Network address is: “, network.String())
  22. ones, bits := mask.Size()
  23. fmt.Println(“Mask bits: “, ones, “Total bits: “, bits)
  24. os.Exit(0)
  25. }

编译并运行该程序,结果如下所示:

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

域名解析

在 net 包中,许多函数或方法调用后返回的是一个指向 IPAddr 结构体的指针,结构体 IPAddr 内只定义了一个 IP 类型的字段,格式如下:

type IPAddr struct {
    IP IP
)

IPAddr 结构体的主要作用是用于域名解析服务 (DNS),例如,函数 ResolveIPAddr() 可以通过主机名解析主机网络地址。ResolveIPAddr() 函数原型定义如下:

func ResolveIPAddr(net, addr string) (*IPAddr, error)

在调用 ResolveIPAddr() 函数时,参数 net 表示网络类型,可以是“ip”、“ip4”或“ip6”,参数 addr 可以是 IP 地址或域名,如果是 IPv6 地址则必须使用“[]”括起来。ResolveIPAddr() 函数调用成功后返回指向 IPAddr 结构体的指针,调用失败返回错误类型 error。

【示例 3】DNS 域名解析。

  1. // DNS 域名解析
  2. package main
  3. import(
  4. “fmt”
  5. “net”
  6. “os”
  7. )
  8. func main() {
  9. if len(os.Args) != 2{
  10. fmt.Fprintf(os.Stderr, “Usage: %s hostname\n”, os.Args[0])
  11. fmt.Println(“Usage: “, os.Args[0], “hostname”)
  12. os.Exit(1)
  13. }
  14. name := os.Args[1]
  15. addr, err := net.ResolveIPAddr(“ip”, name)
  16. if err != nil {
  17. fmt.Println(“Resolvtion error”, err.Error())
  18. os.Exit(1)
  19. }
  20. fmt.Println(“Resolved address is”, addr.String())
  21. os.Exit(0)
  22. }

编译并运行该程序,结果如下所示:

PS D:\code> go run .\main.go c.biancheng.net
                     Resolved address is 61.240.154.117

未经允许不得转载(声明:本文内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:net-net@foxmail.com进行举报,并提供相关证据,工作人员会在10个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。):策信智库资讯网 » Go语言获取IP地址和域名解析

赞 (0)
indian school girls porn videos tubexo.mobi school girls xvideo broken marriage vow march 22 full episode thepinoytv.net abot kamay na pangarap episode today افلام سكس هندي arabicpornmovies.com بنات محجبات سكس شاب ينكح اخته arabianporns.com قصص سكس سعودي سكس في الطيارة muarab.net سكس عربى واجنبى girls fucking videos freshpornclips.mobi xxx free download سكس بكارة porndot.info موقع افلام اباحية bengali sexy sex teenpornvideo.mobi chella kutty كسه 24pornos.com سكس قرد مع بنت punjabi randi sex nudevista.pro mia khalifa naked ashima bhalla bigassporntrends.com www.indianxx nude b grade indiananalfuck.com you pron xxx hinde vedio tubeofporn.mobi iwink tv kolkata girls need sex pornhindimovies.com indian xxx vidio saxy bf download pornborn.mobi co xxx