从C中的子域中提取域

时间:2016-08-04 09:16:54

标签: c parsing dns

我在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获取域名。

有没有办法不使用后缀列表?

2 个答案:

答案 0 :(得分:1)

我不敢:如果没有结果列表,您无法可靠地确定http://www.google.co.in是否应该生成google.co.inco.in

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

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

答案 1 :(得分:0)

为后缀列表构建某种搜索树而不是迭代是有意义的。 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);
}