登录 用户中心() [退出] 后台管理 注册
   
您的位置: 首页 >> CLQ工作室开源代码 >> 主题: github.com/miekg/dns 在 go 1.7.3 中的使用 之 原 dns 在 windows 下的实现源码分析     [回主站]     [分站链接]
标题
github.com/miekg/dns 在 go 1.7.3 中的使用 之 原 dns 在 windows 下的实现源码分析
clq
浏览(398) + 2018-12-31 13:09:28 发表 编辑

关键字:

[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


clq
2018-12-31 13:13:54 发表 编辑

关联的函数应该是
DnsQuery,DnsRecordListFree,DnsRecordCopyEx,DnsModifyRecordsInSet

可参考以下文章 https://blog.csdn.net/liu_si_yan/article/details/51013881

--------------------------------------------------
基于Windows的DNS查询
2016年03月30日 13:59:34 _Noema 阅读数:812
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013545612/article/details/51013881

闲来无事,随便弄弄


    #pragma comment(lib, "ws2_32")
    #include <WinDNS.h>
    #pragma comment(lib, "dnsapi")
    int _tmain(int argc, _TCHAR *argv[])
    {
        PDNS_RECORDW pdns_record = NULL;
        DNS_STATUS dns_status;
        dns_status = DnsQuery_W(L"baidu.com", DNS_TYPE_A, DNS_QUERY_STANDARD, NULL, &pdns_record, NULL);
    
        PDNS_RECORDW pdns_iter = pdns_record;
        unsigned int idx = 0;
    
        while(pdns_iter)
        {
            in_addr iaddr = {0};
            char *paddr = NULL;
            iaddr.S_un.S_addr = pdns_iter->Data.A.IpAddress;
            paddr = inet_ntoa(iaddr);
            printf("index = %d \n", ++idx);
            wprintf(L"domain = %ws \n", pdns_iter->pName);
            printf("data length = %d \n", pdns_iter->wDataLength);
            printf("TTL = %d \n", pdns_iter->dwTtl);
            printf("ip = %s \n\n", paddr);
    
            pdns_iter = pdns_iter->pNext;
        }
    
        DnsRecordListFree(pdns_record, DnsFreeRecordList);
    
    
        system("pause");
        return 0;
    }



总数:1 页次:1/1 首页 尾页  
总数:1 页次:1/1 首页 尾页  


所在合集/目录



发表评论:
文本/html模式切换 插入图片 文本/html模式切换


附件:



NEWBT官方QQ群1: 276678893
可求档连环画,漫画;询问文本处理大师等软件使用技巧;求档softhub软件下载及使用技巧.
但不可"开车",严禁国家敏感话题,不可求档涉及版权的文档软件.
验证问题说明申请入群原因即可.

Copyright © 2005-2020 clq, All Rights Reserved
版权所有
桂ICP备15002303号-1