我该如何在Erlang中构建DNS查询记录?

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> 
3个回答

5

我终于明白了。

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

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接