DNS over UDP示例查询

时间:2015-10-25 20:01:11

标签: c dns udp

我经常发现自己需要测试互联网连接是否在线。特别是,有时它会发生(在非常非常特殊的连接上)UDP被禁用。现在,我认为测试UDP是否可用于我的连接的最简单方法之一是通过DNS查询。

现在,使用像getaddrinfo这样的函数从查询中抽象出UDP,这样(就我的理解而言)如果UDP不可用,将使用TCP。现在,由于我需要测试UDP连接,我需要自己用查询伪造UDP数据包。此外,我想查询公共DNS服务器(如8.8.8.8),以便我确定UDP连接可用于与外部主机通信。

所以我想知道:我可以通过UDP数据包发送的最简单的DNS查询是什么?你能告诉我一个例子,只是要求google.com的IP到DNS服务器吗?

1 个答案:

答案 0 :(得分:2)

我不确定我是否完全理解您的问题,但最简单的查询类似于setcurrentHitPoints1(-500); System.out.println(getCHP1()); // prints 0 SOA(即根区域的权限的开始),如下所示:

.

如果您问的是UDP数据包的外观,只需使用tcpdump捕获它。但是,这些简单的DNS数据包相对容易在C中构建 - 请参阅RFC1035。您可能希望使用预先存在的库,例如c-aresadns

请注意,据我记忆,您的解析程序库是否属于TCP依赖于实现。 Linux上的IIRC glibc不会回退到TCP,而只有$ dig SOA . @8.8.8.8 ; <<>> DiG 9.8.3-P1 <<>> SOA . @8.8.8.8 ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 46366 ;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;. IN SOA ;; ANSWER SECTION: . 4350 IN SOA a.root-servers.net. nstld.verisign-grs.com. 2015102500 1800 900 604800 86400 ;; Query time: 36 msec ;; SERVER: 8.8.8.8#53(8.8.8.8) ;; WHEN: Sun Oct 25 21:07:19 2015 ;; MSG SIZE rcvd: 92 包含/etc/resolv.conf时,OpenBSD上的libresolv才会回退。以编程方式使用options tcp时,您只需要ensure RES_USEVC is clear

如果您正在寻找示例代码,&#39; Stevens&#39;说明的TCP / IP&#39; 是规范的答案。