在 C 中从 netsh 存储 DNS 服务器

Storing DNS servers from netsh in C

所以我实现了一个系统调用,它应该返回给定网络接口的 DNS 服务器(作为变量,即我代码中的 "interface"):

strcpy(str, "netsh interface ipv4 show dnsservers "); 
strcat(str, interface); 
system(str);

现在我的问题是:您建议使用哪种方式来提取这些 DNS 服务器并能够在速度方面对它们进行比较?我有以下函数将平均速度提取为整数,因此两个服务器之间的比较应该很容易,但问题是我遇到的 DNS 没有固定数量。

int average_speed(const char* ip)
{
    const char* const Delim = "Average = ";
    printf("\n    Extracting average %s", ip);

    char cmd[64];
    sprintf(cmd, "ping %s", ip);
    FILE* p = _popen(cmd, "r");
    char line[256];
    while (fgets(line, sizeof(line), p))
    {
        char* s = NULL;
        if ((s = strstr(line, Delim)) != NULL)
        {
            _pclose(p);
            return atoi(s + strlen(Delim));
        }
    }
    _pclose(p);

    return 0;
}

绝对不要使用 ping 来做到这一点。

ping 是几乎所有类型的故障排除的错误工具。

如果您想根据速度对域名服务器进行排序,您只需要做一件事:查询它们,进行 DNS 查询,然后查看它们的回复速度。

这是唯一有意义的事情。所以你需要在你的编程语言中找到如何在最低级别进行 DNS 查询并能够对它们进行计时。

然后你才开始触及表面并解决其他问题:

  • 要做什么查询?如果你知道他们处理一个名字,查询它;否则可以接受查询根名称服务器 NS 记录
  • 你必须处理超时、UDP 最终被截断的回复并在 TCP 上重试等。
  • 查询一次就可以了,但拓扑结构可能会改变;现在 A 可能比 B 快,但也许 5 分钟后会相反;因此,任何这样做的系统都应该是智能的,并且 "regularly" 仍然会再次探测以查看情况是否发生了变化。