6

ネイティブの 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> 
4

3 に答える 3

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).
于 2009-11-16T21:39:06.187 に答える
1

Erlang Questions メーリングリストで Magnus が説明しているように:

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

encode/1 関数で dns_rec レコードの代わりに dns_query を渡していました。

于 2009-11-16T22:31:24.660 に答える
1

inet_dns モジュールに関するドキュメントがないという事実は、コードからそれを使用することに非常に慎重になるはずです。彼ら (OTP チーム) がモジュールの実装方法と使用方法を変更したいと感じた場合、あなたのプロジェクトは考慮されないことを十分に認識していただければ幸いです。

コードを読んで実装のアイデアを得るか、DNS プロトコルの RFC に基づいた Erlang ビット構文を使用して DNS プロトコル メッセージの作成に取り掛かります。DNS パッケージを作成することは、それを解析することよりもはるかに簡単です (私自身もその道をたどりましたが、パケット サイズを最小化するための「巧妙なトリック」はほとんど役に立たないようです)。

于 2009-11-16T20:58:15.627 に答える