Как создать запись DNS-запроса в Erlang? - PullRequest
6 голосов
/ 16 ноября 2009

Я собираю собственную библиотеку Bonjour / Zeroconf и мне нужно создать записи DNS-запросов для передачи на другие машины. Я попытался просмотреть исходный код Erlang, но, поскольку я относительно новичок в Erlang, он немного утопает во всех файлах inet_XXX.erl и .hrl. У меня есть слушатель, который работает для получения и анализа полезных данных записей DNS, я просто не могу понять, как создавать записи запросов. Что мне действительно нужно знать, это то, что мне нужно передать в inet_dns: encode (), чтобы получить двоичный файл, который я могу отправить. Вот что я пытаюсь сделать.

{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> 

Ответы [ 3 ]

4 голосов
/ 17 ноября 2009

Я наконец понял это.

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 голос
/ 17 ноября 2009

Как объяснил Магнус в списке рассылки вопросов Erlang:

http://groups.google.com/group/erlang-programming/browse_thread/thread/ce547dab981219df/47c3ca96b15092e0?show_docid=47c3ca96b15092e0

вы передавали dns_query вместо записи dns_rec в функции encode / 1.

1 голос
/ 16 ноября 2009

Отсутствие документации по модулю inet_dns заставит вас очень осторожно использовать его в своем коде. Я надеюсь, что вы полностью осведомлены о том, что ваш проект не будет учитываться, если они (команда OTP) захотят изменить способ реализации и использования модуля.

Прочтите код для идей реализации или просто приступайте к созданию сообщения протокола DNS с использованием синтаксиса битов Erlang на основе RFC в протоколе DNS. Создать пакет DNS гораздо проще, чем его синтаксический анализ (я сам пошел по этому пути, и «хитрые приемы» по минимизации размера пакета вряд ли стоили того).

...