如何使用c中的解析器库获取linux中的ipv6 dns服务器列表

问题描述

我正在尝试通过解析器库获取c中所有DNS服务器的列表,但无法获取ipv6 DNS服务器的列表,请帮助我。

OS: Debian GNU/Linux 10 (buster)

这是测试代码

#include <stdio.h>
#include <arpa/inet.h>
#include <resolv.h>

int main(int argc,char **argv)
{
    struct __res_state statp;
    char addr_str[80];
    if(res_ninit(&statp) < 0)
    {
        fprintf(stderr,"init resolver Failed\n");
        return 1;
    }
    //ipv6 dns server
    for(int i =  0; i < statp._u._ext.nscount; i++)
    {
        if(statp._u._ext.nsaddrs[i]->sin6_family == AF_INET6)
        {
            if(inet_ntop(AF_INET6,&statp._u._ext.nsaddrs[i]->sin6_addr,addr_str,80) != NULL)
            {
                printf("ipv6 dns server = %s\n",addr_str);
            }
        }
    }
    //ipv4 dns server
    for(int i =  0; i < statp.nscount; i++)
    {
        if(statp.nsaddr_list[i].sin_family == AF_INET)
        {
            if(inet_ntop(AF_INET,&statp.nsaddr_list[i].sin_addr,80) != NULL)
            {
                printf("ipv4 dns server = %s\n",addr_str);
            }
        }
    }
    res_nclose(&statp);
    return 0;
}

/etc/resolv.conf:

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
#     DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
nameserver 2001:19f0:300:1704::6
nameserver 108.61.10.10

gdb调试代码

(gdb) p statp._u._ext 
$2 = {nscount = 0,nsmap = {0,77,0},nssocks = {-1,-1,-134331088},nscount6 = 32767,nsinit = 0,nsaddrs = {0x555555559630,0x0,0x555555555090 <_start>},__glibc_reserved = {1219461217,648608350}}
(gdb) p *statp._u._ext.nsaddrs[0]
$3 = {sin6_family = 10,sin6_port = 13568,sin6_flowinfo = 0,sin6_addr = {__in6_u = {
      __u6_addr8 = " \001\031\360\003\000\027\004\000\000\000\000\000\000\000\006",__u6_addr16 = {288,61465,3,1047,1536},__u6_addr32 = {4028170528,68616195,100663296}}},sin6_scope_id = 0}

statp._u._ext.nscount 为 0,但 statp._u._ext.nsaddrs[0] 是正确的 ipv6 dns 服务器 sockaddr。

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)