在 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" 仍然会再次探测以查看情况是否发生了变化。
所以我实现了一个系统调用,它应该返回给定网络接口的 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" 仍然会再次探测以查看情况是否发生了变化。