Vorrei sapere quali sono i compiti che deve svolgere un server DNS e se possibile come lo si potrebbe implementare in C?

Un server DNS (Domain Name Server) ha lo scopo
di tradurre gli indirizzi dei nodi della rete Internet dalla forma
“normale” a quella numerica.

Il funzionamento del protocollo TCP/IP (vedere anche una precedente
risposta)
infatti prevede che i nodi della rete siano univocamente identificati
mediante un Numero IP, costituito da quattro valori compresi fra
0 e 256. Ad esempio il computer che fa da supporto al sito di
“Vialattea” ha numero IP: 213.145.29.14.

I numeri IP sono però difficili da ricordare; per un “umano” è
assai più facile ricordare qualche cosa che somigli ad un nome, ad
esempio www.vialattea.net. Per questo motivo il funzionamento
della rete Internet prevede l’uso di nomi per identificare i nodi di rete
ed un meccanismo di traduzione fra nomi e corrispondenti numeri IP.

I server DNS sono programmi, attivi su particolari nodi, che mantengono
le tabelle di informazioni necessarie per effettuare la traduzione dei nomi
e per fare questo automaticamente si scambiano fra loro le variazioni
che via via si verificano.

La struttura dei server DNS è gerarchica, come è gerarchica
la struttra dei nomi dei nodi, e l’informazione (cioè le tabelle)
è diffusa in tutta la rete. Per comprendere questo fatto vediamo come
avviene la traduzione di un nome:

Quando il mio PC deve collegarsi a www.vialattea.net, chiede al suo DNS
(che normalmente si trova abbastanza “vicino”, ad esempio sulla stessa LAN,
e che viene specificato nella configurazione della rete) la traduzione del nome.
Il DNS si rivolge ad un server di primo livello per sapere quale server
DNS contiene le tabelle relative ai nomi che terminano per .net
e riceve il numero relativo;
poi si rivolge a questo per sapere quale server DNS contiene i nomi
che terminano per .vialattea.net e riceve un secondo numero IP;
infine interroga quest’ultimo server
per avere il numero corrispondente a www.vialattea.net
e lo passa al mio PC
come risposta finale all’interrogazione.
Si noti che in questo modo i server di primo livello contengono solo le
informazioni relative ai server di secondo livello; questi ultimi solo
quelle
dei server di terzo livello del proprio gruppo; quelli dell’ultimo
livello
di solito contengono le informazioni relative alla propria LAN.

Il sistema
è un po’ più complicato in quanto prevede vari meccanismi di ridondanza
per accelerare le risposte e per evitare che la
traduzione di un nome sia affidata ad un solo server; nonché
meccanismi per aggiornare automaticamente le informazioni.

Per quanto riguarda le implementazioni la più usata e più
nota è una versione “open source” nota con il nome
di BIND (Berkeley Internet Name Domain)
ed è distribuita in forma sorgente, quindi costituisce
il miglior esempio possibile di come realizzare un server DNS:

http://www.isc.org/