2009-11-16 8 views
6

Je construis une bibliothèque native Bonjour/Zeroconf et j'ai besoin de générer des enregistrements de requêtes DNS pour les diffuser aux autres machines. J'ai essayé de regarder à travers le code source d'Erlang mais comme je suis relativement nouveau à Erlang, il devient assez dense dans les entrailles de tous les fichiers inet_XXX.erl et .hrl. J'ai un écouteur qui fonctionne pour recevoir et analyser les charges utiles d'enregistrement DNS, je n'arrive pas à comprendre comment créer les enregistrements de requête. Ce que j'ai vraiment besoin de savoir, c'est ce que j'ai besoin de passer dans inet_dns: encoder() pour obtenir un binaire que je peux envoyer. Voici ce que j'essaie de faire.Comment créer un enregistrement de requête DNS dans Erlang?

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

est là l'erreur que je reçois

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

Répondre

4

J'ai finalement compris.

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

Le fait qu'il n'y a pas de documentation pour le module inet_dns devrait vous faire très prudent de l'utiliser à partir de votre code. J'espère que vous êtes pleinement conscient que votre projet ne sera pas pris en compte s'il (l'équipe du Bureau du Procureur) a envie de changer la façon dont le module est mis en œuvre et utilisé.

Lisez le code des idées de mise en œuvre, ou rédigez simplement le message de protocole DNS en utilisant la syntaxe de bit Erlang basée sur les RFC du protocole DNS. Créer un paquet DNS est beaucoup plus facile que de l'analyser (je suis moi-même allé dans cette direction, et les «astuces astucieuses» pour minimiser la taille des paquets ne semblent guère en valoir la peine).

+2

Vous devriez projeter ceci dans le contexte d'il y a 20 ans et plus où les bits étaient beaucoup plus chers qu'aujourd'hui. – jldupont

Questions connexes