Наш ответ libresolv
Объектно-ориентированная реализация DNS Lookup на C++
Недавно мне пришлось заняться изучением интерфейса библиотеки libresolv, отвечающей за формирование DNS-запросов и получение и разбор ответов (хотя разбор — это громко сказано). Так получилось, что нормальной внятной документации по API-функциям с примерами использования я найти не смог (может, я не там искал). И хотя код — лучшая документация
, окончательно разобраться с форматом возвращаемых данных я смог только после изучения RFC, посвященных DNS.
В результате трёхдневного изучения у меня родилась небольшая библиотека, являющаяся интерфейсом к libresolv, написанная с использованием объектно-ориентированного подхода. Большой упор делался на безопасность. Библиотека пока еще в бета-версии (нет поддержки IPv6, нет интерфейса для изменения флагов запроса, разбираются только записи A, CNAME, MX, NS, NULL, PTR, SOA, SPF, SRV, TXT), но очень легко расширяется. Возможно, кому-нибудь пригодится…
Пример использования:
#include <iostream> #include "sj_dns.h" int main(int argc, char** argv) { DnsQuery q; //q.setNameserver("127.0.0.1", 53); ::std::auto_ptr<DnsResponse> r(q.query("sjinks.org.ua", DnsQuestion::cl_in, DnsQuestion::rr_wild)); if (0 != r.get()) { ::std::cout << *(r.get()); } return 0; }
Результат:
vladimir@SJINKS:~/test/FCrDNS$ g++ *.cpp -o test -lresolv -Wall -O3 && ./test ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16821 ;; flags: rd ra; QUERY: 1, ANSWER: 14, AUTHORITY: 9, ADDITIONAL: 10 ;; QUESTION SECTION: ;sjinks.org.ua IN ANY ;; ANSWER SECTION: sjinks.org.ua 54149 IN SPF "v=spf1 a mx:sjinks.org.ua -all" sjinks.org.ua 54149 IN TXT "v=spf1 a mx:sjinks.org.ua -all" sjinks.org.ua 54149 IN MX 10 sjinks.org.ua sjinks.org.ua 54149 IN SOA ns1.sjinks.org.ua sjinks.sjinks.org.ua 2008042900 86400 15 54432000 15 sjinks.org.ua 50662 IN A 195.10.218.132 sjinks.org.ua 54149 IN NS ns.secondary.net.ua sjinks.org.ua 54149 IN NS ns0.xname.org sjinks.org.ua 54149 IN NS ns1.xname.org sjinks.org.ua 54149 IN NS ns1.sjinks.org.ua sjinks.org.ua 54149 IN NS NS1.EVERYDNS.net sjinks.org.ua 54149 IN NS ns2.trifle.net sjinks.org.ua 54149 IN NS NS2.EVERYDNS.net sjinks.org.ua 54149 IN NS NS3.EVERYDNS.net sjinks.org.ua 54149 IN NS NS4.EVERYDNS.net ;; AUTHORITY SECTION: sjinks.org.ua 54149 IN NS NS4.EVERYDNS.net sjinks.org.ua 54149 IN NS ns.secondary.net.ua sjinks.org.ua 54149 IN NS ns0.xname.org sjinks.org.ua 54149 IN NS ns1.xname.org sjinks.org.ua 54149 IN NS ns1.sjinks.org.ua sjinks.org.ua 54149 IN NS NS1.EVERYDNS.net sjinks.org.ua 54149 IN NS ns2.trifle.net sjinks.org.ua 54149 IN NS NS2.EVERYDNS.net sjinks.org.ua 54149 IN NS NS3.EVERYDNS.net ;; ADDITIONAL SECTION: sjinks.org.ua 50662 IN A 195.10.218.132 ns.secondary.net.ua 20692 IN A 195.149.112.1 ns0.xname.org 29640 IN A 195.234.42.1 ns1.xname.org 30415 IN A 87.98.164.164 ns1.sjinks.org.ua 53539 IN A 195.10.218.132 NS1.EVERYDNS.net 41867 IN A 208.76.56.56 ns2.trifle.net 74710 IN A 195.24.128.164 NS2.EVERYDNS.net 129350 IN A 204.152.184.150 NS3.EVERYDNS.net 32542 IN A 208.96.6.134 NS4.EVERYDNS.net 2226 IN A 64.158.219.3

