我在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获取域名。
有没有办法不使用后缀列表?
答案 0 :(得分:1)
我不敢:如果没有结果列表,您无法可靠地确定http://www.google.co.in
是否应该生成google.co.in
或co.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);
}