Наш ответ libresolv
Объектно-ориентированная реализация DNS Lookup на C++
Недавно мне пришлось заняться изучением интерфейса библиотеки libresolv, отвечающей за формирование DNS-запросов и получение и разбор ответов (хотя разбор — это громко сказано). Так получилось, что нормальной внятной документации по API-функциям с примерами использования я найти не смог (может, я не там искал). И хотя код — лучшая документация
, окончательно разобраться с форматом возвращаемых данных я смог только после изучения RFC, посвященных DNS.
В результате трёхдневного изучения у меня родилась небольшая библиотека, являющаяся интерфейсом к libresolv, написанная с использованием объектно-ориентированного подхода. Большой упор делался на безопасность. Библиотека пока еще в бета-версии (нет поддержки IPv6, нет интерфейса для изменения флагов запроса, разбираются только записи A, CNAME, MX, NS, NULL, PTR, SOA, SPF, SRV, TXT), но очень легко расширяется. Возможно, кому-нибудь пригодится…
Пример использования:
#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 541