Ars Longa, Vita Brevis

May 6, 2008

Наш ответ libresolv

Рубрика: C/C++, Linux
Tags: ,
Vladimir @ 05:36
RSS 2.0

Объектно-ориентированная реализация DNS Lookup на C++

Недавно мне пришлось заняться изучением интерфейса библиотеки libresolv, отвечающей за формирование DNS-запросов и получение и разбор ответов (хотя разбор — это громко сказано). Так получилось, что нормальной внятной документации по API-функциям с примерами использования я найти не смог (может, я не там искал). И хотя код — лучшая документация, окончательно разобраться с форматом возвращаемых данных я смог только после изучения RFC, посвященных DNS.

В результате трёхдневного изучения у меня родилась небольшая библиотека, являющаяся интерфейсом к libresolv, написанная с использованием объектно-ориентированного подхода. Большой упор делался на безопасность. Библиотека пока еще в бета-версии (нет поддержки IPv6, нет интерфейса для изменения флагов запроса, разбираются только записи A, CNAME, MX, NS, NULL, PTR, SOA, SPF, SRV, TXT), но очень легко расширяется. Возможно, кому-нибудь пригодится…

Пример использования:

[-]
View Code C++
#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   541