2009-11-16 57 views
6

我正在構建一個本地的Bonjour/Zeroconf庫,需要構建DNS查詢記錄以向其他機器廣播。我已經試過通過Erlang源代碼,但由於我是Erlang相對較新的代碼,它在所有inet_XXX.erl和.hrl文件的腸子中變得密集起來。我有一個監聽器用於接收和解析DNS記錄有效負載,但我無法弄清楚如何創建查詢記錄。我真正需要知道的是我需要傳遞給inet_dns:encode()以獲取我可以發送的二進制文件。這是我想要做的。如何在Erlang中構建DNS查詢記錄?

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

這裏是我得到

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

回答

4

我終於明白了。

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

存在的inet_dns模塊應該讓你十分警惕使用它從你的代碼中沒有文件的事實錯誤。我希望您充分意識到,如果他們(OTP團隊)想改變模塊的實施和使用方式,就不會考慮您的項目。

閱讀實現想法的代碼,或者只是使用基於DNS協議上的RFC的Erlang位語法創建DNS協議消息。創建一個DNS包比解析它要容易得多(我自己一直在這條道路上,而最小化包大小的「巧妙技巧」似乎不值得)。

+2

您應該在20多年前的環境中進行此項設計,其中位比今天貴得多。 – jldupont 2009-11-17 13:28:42