- 前言
- Go 与操作系统
- Go 内部机制
- Go 基本数据类型
- 4 组合类型的使用
- 5 数据结构
- 6 Go package 中不为人知的知识
- 7 反射和接口
- 8 Go UNIX 系统编程
- 08.1 关于 UNIX 进程
- 08.2 flag 包
- 8.2 flag 包
- 08.3 io.Reader 和 io.Writer 接口
- 08.4 bufio 包
- 08.5 读取文本文件
- 08.6 从文件中读取所需的数据量
- 08.7 为什么我们使用二进制格式
- 08.8 读取 CSV 文件
- 08.9 写入文件
- 08.10 从磁盘加载和保存数据
- 08.11 再看strings包
- 08.12 关于bytes包
- 08.13 文件权限
- 08.14 处理 Unix 信号
- 08.15 Unix 管道编程
- 08.16 遍历目录树
- 08.17 使用 ePBF
- 08.18 关于 syscall.PtraceRegs
- 08.19 跟踪系统调用
- 08.20 User ID 和 group ID
- 08.21 其他资源
- 08.22 练习
- 08.23 总结
- 9 并发 Goroutines、Channel 和 Pipeline
- 10 Go 并发-进阶讨论
- 11 代码测试、优化及分析
- 12 Go 网络编程基础
- 13 网络编程 - 构建服务器与客户端
12.6 实现 DNS 查询
DNS全称Domain Name System(域名系统),它的作用是将IP地址转换为类似 packt.com
的域名,或者将域名转换为IP地址。本节中开发的 DNS.go
程序的处理逻辑非常简单:如果程序执行时的命令行参数是一个有效的IP地址,则程序将查询该IP地址对应的主机名;其他情况下,程序将假定它处理的是一个主机名,并将其转换成一个或多个IP地址。
程序 DNS.go
的代码将分三部分介绍。第一部分程序包含以下Go代码:
> package main
>
> import (
> "fmt"
> "net"
> "os"
> )
>
> func lookIP(address string) ([]string, error) {
> hosts, err := net.LookupAddr(address)
> if err != nil {
> return nil, err
> }
> return hosts, nil
> }
>
> func lookHostname(hostname string) ([]string, error) {
> IPs, err := net.LookupHost(hostname)
> if err != nil {
> return nil, err
> }
> return IPs, nil
> }
函数 lookIP()
将一个IP地址作为输入,然后返回与该IP地址匹配的主机列表,这个功能通过函数 net.LookupAddr()
的帮助来实现。
而函数 lookHostname()
将主机名作为输入,使用 net.LookupHost()
函数进行处理,返回一个相关IP地址的列表。
程序 DNS.go
的第二部分是以下Go代码:
> func main() {
> arguments := os.Args
> if len(arguments) == 1 {
> fmt.Println("Please provide an argument!")
> return
> }
>
> input := arguments[1]
> IPaddress := net.ParseIP(input)
函数 net.ParseIP()
可以将输入字符串解析为IPv4或IPv6地址。如果输入一个非法的IP地址,函数 net.ParseIP()
将返回 nil
。
程序 DNS.go
的剩余Go代码如下:
> if IPaddress == nil {
> IPs, err := lookHostname(input)
> if err == nil {
> for _, singleIP := range IPs {
> fmt.Println(singleIP)
> }
> }
> } else {
> hosts, err := lookIP(input)
> if err == nil {
> for _, hostname := range hosts {
> fmt.Println(hostname)
> }
> }
> }
> }
执行 DNS.go
程序,并携带不同的输入参数,将生成以下输出:
> $ go run DNS.go 127.0.0.1
> localhost
> $ go run DNS.go 192.168.1.1
> cisco
> $ go run DNS.go packtpub.com
> 83.166.169.231
> $ go run DNS.go google.com
> 2a00:1450:4001:816::200e
> 216.58.210.14
> $ go run DNS.go www.google.com
> 2a00:1450:4001:816::2004
> 216.58.214.36
> $ go run DNS.go cnn.com
> 2a04:4e42::323
> 2a04:4e42:600::323
> 2a04:4e42:400::323
> 2a04:4e42:200::323
> 151.101.193.67
> 151.101.1.67
> 151.101.129.67
> 151.101.65.67
可以看到 go run DNS.go 192.168.1.1
命令的输出来自/etc/hosts
文件,因为在/etc/hosts
文件中配置了IP地址 192.168.1.1
的别名 cisco
。
最后一个命令的输出演示了域名( cnn.com
)可能有多个公网IP地址映射。请特别注意公网这个词,尽管 www.google.com
有多个IP地址,但是只有地址( 216.58.214.36
)是公网IP地址。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论