2009-11-16 15 views
6

Sto costruendo una libreria nativa Bonjour/Zeroconf e ho bisogno di creare record di query DNS da trasmettere alle altre macchine. Ho provato a cercare attraverso il codice sorgente di Erlang, ma siccome sono relativamente nuovo a Erlang, diventa un po 'denso nelle viscere di tutti i file inet_XXX.erl e .hrl. Ho un listener che funziona per ricevere e analizzare i payload dei record DNS, non riesco proprio a capire come creare i record delle query. Quello che ho veramente bisogno di sapere è quello che devo passare in inet_dns: encode() per ottenere un binario che posso inviare. Ecco cosa sto cercando di fare.Come si crea un record di query DNS in Erlang?

{ok,P} = inet_dns:encode(#dns_query{domain="_daap._tcp.local",type=ptr,class=in}) 

qui è l'errore che sto ottenendo

10> test:send(). 
** exception error: {badrecord,dns_rec} 
    in function inet_dns:encode/1 
    in call from test:send/0 
11> 

risposta

4

Finalmente ho capito.

send(Domain) -> 
    {ok,S} = gen_udp:open(5555,[{reuseaddr,true}, {ip,{224,0,0,251}}, {multicast_ttl,4}, {multicast_loop,false}, {broadcast,true}, binary]), 
    P = #dns_rec{header=#dns_header{},qdlist=[#dns_query{domain=Domain,type=ptr,class=in}]}, 
    gen_udp:send(S,{224,0,0,251},5353,inet_dns:encode(P)), 
    gen_udp:close(S). 
1

Il fatto che non v'è alcuna documentazione per il modulo inet_dns dovrebbe farvi molto cauti di utilizzarlo dal codice. Spero tu sia pienamente consapevole del fatto che nessuna considerazione verrà presa sul tuo progetto se loro (il team OTP) sentono di cambiare il modo in cui il modulo viene implementato e utilizzato.

Leggere il codice per le idee di implementazione o semplicemente scendere alla creazione del messaggio del protocollo DNS utilizzando la sintassi del bit Erlang basata sulle RFC sul protocollo DNS. Creare un pacchetto DNS è molto più facile che analizzarlo (sono stato io stesso su questa strada, e le "astuzie astute" per minimizzare le dimensioni del pacchetto sembrano non valerne la pena).

+2

Si dovrebbe progettare questo nel contesto di oltre 20 anni fa, dove i bit erano molto più costosi di oggi. – jldupont

Problemi correlati