一个轻量级的DNS客户端, 实现对A
与AAAA
记录的查询解析.
-
使用现代
C++11
标准编写, 可同时支持C
/C++
使用. -
跨平台兼容性好, 方便自行交叉编译. 使用简单、接口稳定.
-
同时支持
IPv4
和IPv6
, 无需开发者编写多余判断代码. -
可使用
CMAKE
构建二进制文件, 也可自行拷贝源文件自行编译. -
代码干净并无任何系统调用, 让你轻松集成到任何现有框架内.
-
同时在阻塞和非阻塞环境中使用, 让查询变得更加简单.
-
Windows
-
Linux
-
MacOS
-
FreeBSD
-
gcc
-
clang
-
msvc
查询: 通过dns_query
生成查询内容, 开发者自行发送至对端socket
.
响应: 通过dns_parse
解析响应内容, answers
数量与回调次数一致.
/* main.c */
#include "stdio.h"
#include "string.h"
#include "dns.h"
void cb(void *udata, const dns_ans_t *ans)
{
dns_type_t t = dns_get_type(ans);
const char *ip = dns_get_ip(ans);
printf("回调: type = %d, ip = '%s', 字符串长度: %d\n", t, ip, strlen(ip));
}
int main(int argc, char const *argv[])
{
const char resp[] = ".o\201\200\000\001\000\002\000\004\000\b\004ipv6\006google\003com\000\000\034\000\001\300\f\000\005\000\001\000\000\000i\000\t\004ipv6\001l\300\021\300-\000\034\000\001\000\000\001,\000\020$\004h\000@\005\b\021\000\000\000\000\000\000 \016\300\021\000\002\000\001\000\003\372\334\000\006\003ns2\300\021\300\021\000\002\000\001\000\003\372\334\000\006\003ns3\300\021\300\021\000\002\000\001\000\003\372\334\000\006\003ns1\300\021\300\021\000\002\000\001\000\003\372\334\000\006\003ns4\300\021\300\202\000\001\000\001\000\000\365A\000\004\330\357 \n\300\202\000\034\000\001\000\000\365A\000\020 \001H`H\002\0002\000\000\000\000\000\000\000\n\300^\000\001\000\001\000\000\365A\000\004\330\357\"\n\300^\000\034\000\001\000\000\365A\000\020 \001H`H\002\0004\000\000\000\000\000\000\000\n\300p\000\001\000\001\000\000\365A\000\004\330\357$\n\300p\000\034\000\001\000\000\365A\000\020 \001H`H\002\0006\000\000\000\000\000\000\000\n\300\224\000\001\000\001\000\000\365A\000\004\330\357&\n\300\224\000\034\000\001\000\000\365A\000\020 \001H`H\002\0008\000\000\000\000\000\000\000\n";
dns_req_t *req = dns_new();
dns_set_unsafe();
char data[10086]; int r = 0;
r = dns_query(req, A, "ipv6.google.com", data);
printf("q r = %d\n", r);
r = dns_parse(req, resp, NULL, cb);
printf("r r = %d\n", r);
dns_destory(req);
return 0;
}
c++ -o adns.so dns.cc -fPIC -shared -O0 -g -std=c++11
cc -o main main.c -O0 -g ./adns.so -fsanitize=address && ./main
q r = 33
回调: type = 5, ip = 'ipv6.l.google.com', 字符串长度: 17
回调: type = 28, ip = '2404:6800:4005:0811:0000:0000:0000:200e', 字符串长度: 39
r r = 0
请参阅CMakeLists.txt