dnsAan de slag met DNS


Opmerkingen

Het Domain Name System (DNS) is een hiërarchische , gedistribueerde wereldwijde database, die meestal wordt gebruikt voor het toewijzen van hostnamen aan hun respectieve IP-adressen. Het is gedefinieerd in RFC 1034 en RFC 1035 , en talrijke updates daarvan.

Een domeinnaam is een reeks labels gescheiden door het puntteken ( . ). Elk label mag maximaal 63 tekens bevatten en een domeinnaam mag maximaal 255 tekens bevatten.

De DNS wordt vaak beschreven als een boomstructuur, met de "root zone" bovenaan, de Top Level Domains (TLD's) bijv. com , uk , etc daaronder, enz. Binnen een domeinnaam worden de labels weergegeven in een "kleine endian 'met het bladknooppuntlabel het meest links en het TLD het meest rechts. Als na het TLD een volgperiode verschijnt, wordt gezegd dat de naam een volledig gekwalificeerde domeinnaam is , waarbij de volgperiode de rootzone zelf vertegenwoordigt.

Naamzoekopdrachten uitvoeren in C

De functie getaddrinfo() is de aanbevolen POSIX-functie om te communiceren met de systeemresolver. Afhankelijk van de systeemconfiguratie zal het zoeken naar namen uitvoeren in de DNS, /etc/hosts , mDNS, etc.

Het heeft de voorkeur boven de verouderde gethostbyname() van functies omdat het zowel IPv4- als IPv6-adressering ondersteunt, en tegelijkertijd ook opzoekingen van servicenamen kan uitvoeren (bijv. http toewijzen aan poort 80)

#include <sys/types.h>
#include <sys/socket.h>
#include <netdb.h>

...

struct addrinfo hints;
struct addrinfo *result;
int r;

memset(&hints, 0, sizeof(hints));
hints.ai_family = AF_UNSPEC;           // allow IPv4 or IPv6
hints.ai_socktype = SOCK_STREAM;       // make a stream (TCP) connection

r = getaddrinfo(hostname, "http", &hints, &result);
if (r != 0) {
    fprintf(stderr, "getaddrinfo: %s\n", gai_strerror(r));
} else {
    // iterate over the linked list
    for (struct addrinfo *rp = result; rp != NULL; rp = rp->ai_next) {
        // use rp fields to create a socket and connect to it 
    }
    freeaddrinfo(result);
}