2009-11-16 8 views
6

Ich baue eine native Bonjour/Zeroconf-Bibliothek und muss DNS-Abfragedatensätze erstellen, um sie an die anderen Computer zu übertragen. Ich habe versucht, durch den Erlang-Quellcode zu suchen, aber da ich relativ neu in Erlang bin, wird es ziemlich dicht in den Eingeweiden aller inet_XXX.erl- und .hrl-Dateien. Ich habe einen Listener, der für das Empfangen und Analysieren der DNS-Datensatznutzlasten arbeitet, ich kann einfach nicht herausfinden, wie die Abfragedatensätze erstellt werden. Was ich wirklich wissen muss, ist, was ich in inet_dns übergeben muss: encode(), um eine Binärdatei zu erhalten, die ich aussenden kann. Hier ist, was ich versuche zu tun.Wie erstelle ich einen DNS-Abfrage-Datensatz in Erlang?

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

hier ist der Fehler, den ich

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

Antwort

4

Ich habe es endlich herausgefunden.

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

Die Tatsache, dass es keine Dokumentation für das inet_dns Modul bin immer ist, sollten Sie sehr vorsichtig mit ihm aus dem Code machen. Ich hoffe, Sie sind sich darüber im Klaren, dass Ihr Projekt nicht berücksichtigt wird, wenn sie (das OTP-Team) die Implementierung und Nutzung des Moduls ändern möchten.

Lesen Sie den Code für Implementierungsideen, oder gehen Sie einfach zur Erstellung der DNS-Protokollnachricht mit der Erlang-Bit-Syntax auf der Grundlage der RFCs auf dem DNS-Protokoll. Das Erstellen eines DNS-Pakets ist viel einfacher als das Analysieren (ich bin selbst diesen Weg gegangen, und die "cleveren Tricks" zur Minimierung der Paketgröße scheinen es kaum wert zu sein).

+2

Sie sollten dies im Kontext von mehr als 20 Jahren projizieren, wo Bits viel teurer waren als heute. – jldupont