【问题标题】:Extract domain from sub domain in C从C中的子域中提取域
【发布时间】:2016-08-04 09:16:54
【问题描述】:

我正在用 C 解析一个 DNS 查询数据包。我需要从查询名称中的主机中提取域。

例如:

https://www.google.com --> google.com
http://www.google.co.in --> google.co.in
http://maps.google.com --> google.com
www.abc.xyz --> abc.xyz

根据我的研究,我需要解析来自 https://publicsuffix.org 等来源的 TLD,并且可以使用 sscanf/regex 来获取域名。

不使用后缀列表有什么办法吗?

【问题讨论】:

  • 没有。这就是拥有后缀列表的意义所在。
  • 那么,我应该使用后缀制作sscanf格式吗?

标签: c parsing dns


【解决方案1】:

恐怕不会:没有后缀列表,您无法可靠地确定 http://www.google.co.in 是否应该产生 google.co.inco.in

关于方法,对于简单的方法,您应该将后缀列表加载到哈希表或排序表中。通过手动扫描'.' 来确定带有strrchr() 的最后一个后缀和之前的后缀。列表中不存在但具有后缀即域名的第一个后缀组合。

https://publicsuffix.org 发布的列表中描述的规则更加详细。我建议寻找公开可用的源代码或库来处理这种匹配,而不是尝试编写自己的匹配器。除非你非常精通 C 或将其作为作业。

【讨论】:

  • 我研究了 URI 解析器和 HTParse,但只能提取主机,而不是从主机中提取域。
【解决方案2】:

为后缀列表构建某种搜索树而不是迭代是有意义的。 reg-dom lib 就是这样做的:

#include <stdio.h>
#include <assert.h>

#include "regdom.h"

int main(int argc, char *argv[]) {
    assert(argc > 1);
    void *tree = loadTldTree();

    char *domain = getRegisteredDomainDrop(argv[1], tree, 1);
    printf("Domain suffix is %s\n", domain ? domain : "Unknown");

    freeTldTree(tree);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-06
    • 2023-02-10
    • 2013-07-19
    • 2015-08-03
    • 2011-06-22
    • 2015-09-27
    • 2021-11-16
    • 2012-08-28
    相关资源
    最近更新 更多