我正在构建一个原生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> 发布于 2009-11-17 05:39:06
我终于想通了。
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-17 04:58:16
事实上,没有关于inet_dns模块的文档,这应该使您在代码中使用它时非常谨慎。我希望你充分意识到,如果他们( OTP团队)想要改变模块的实现和使用方式,就不会考虑你的项目。
阅读实现思想的代码,或者直接开始根据DNS协议上的RFC使用Erlang位语法创建DNS协议消息。创建DNS包要比解析它容易得多(我自己也经历过这种情况,最小化数据包大小的“小窍门”似乎不值得这么做)。
发布于 2009-11-17 06:31:25
正如Magnus在Erlang问题邮件列表中所解释的那样:
您在encode/1函数中传递的是dns_query而不是dns_rec记录。
https://stackoverflow.com/questions/1740297
复制相似问题