[2023-06-22 17:18:58 最后更新]
github.com/miekg/dns 在 go 1.7.3 中的使用 之 原 dns 在 windows 下的实现源码分析
前面发了文章 "github.com/miekg/dns 在 go 1.7.3 中的使用",之所以要使用 github.com/miekg/dns 的原因是因为原始 golang 的 dns 查询居然是不能指定 dns 服务器地址的。
心中觉得非常不可思议,心想这是非常简单的啊,而且 golang 都是源码,简单更改一下就可以了。
不料追查下去发现 golang 在这部分的实现居然是使用 dll 中的函数来实现的! 一开始我想这大概是 goalng 还年轻,没有太多时间把所有东西都全部重写。
不过仔细想想一个操作系统的 dns 除了查询服务器,还要查找 host 文件等,所以直接调用 windows api 也不是不合适。
另,golang 在 unix/linux 下是的实现与 windows 类似。
核心代码如下:
lookup_windows.go
func lookupMX(ctx context.Context, name string) ([]*MX, error) {
// TODO(bradfitz): finish ctx plumbing. Nothing currently depends on this.
acquireThread()
defer releaseThread()
var r *syscall.DNSRecord
e := syscall.DnsQuery(name, syscall.DNS_TYPE_MX, 0, nil, &r, nil)
zsyscall_windows.go
func _DnsQuery(name *uint16, qtype uint16, options uint32, extra *byte, qrs **DNSRecord, pr *byte) (status error) {
r0, _, _ := Syscall6(procDnsQuery_W.Addr(), 6, uintptr(unsafe.Pointer(name)), uintptr(qtype), uintptr(options), uintptr(unsafe.Pointer(extra)), uintptr(unsafe.Pointer(qrs)), uintptr(unsafe.Pointer(pr)))
if r0 != 0 {
status = Errno(r0)
}
return
}
procDnsQuery_W = moddnsapi.NewProc("DnsQuery_W")
即最后是调用函数 DnsQuery_W
Requirements
Minimum supported client Windows 2000 Professional [desktop apps only]
Minimum supported server Windows 2000 Server [desktop apps only]
Target Platform Windows
Header windns.h
Library Dnsapi.lib
DLL Dnsapi.dll