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

没有关于 inet_dns 模块的文档这一事实应该让您非常谨慎地在代码中使用它。我希望您充分意识到,如果他们(OTP 团队)想要更改模块的实现和使用方式,则不会考虑您的项目。

阅读代码以获得实现思路,或者只是开始使用基于 DNS 协议上的 RFC 的 Erlang 位语法创建 DNS 协议消息。创建一个 DNS 包比解析它要容易得多(我自己一直在走这条路,而最小化数据包大小的“聪明技巧”似乎不值得)。

于 2009-11-16T20:58:15.627 回答
1

正如 Magnus 在 Erlang Questions Mailing 列表中所解释的:

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

您在 encode/1 函数中传递了 dns_query 而不是 dns_rec 记录。

于 2009-11-16T22:31:24.660 回答