代码之家  ›  专栏  ›  技术社区  ›  user177800

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

  •  6
  • user177800  · 技术社区  · 15 年前

    我正在构建一个本地的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 回复  |  直到 15 年前
        1
  •  4
  •   user177800    15 年前

    我终于明白了。

    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).
    
        2
  •  1
  •   Christian    15 年前

    事实上,没有关于inet_-dns模块的文档,这会使您非常谨慎地从代码中使用它。我希望您充分意识到,如果他们(OTP团队)想要改变模块的实现和使用方式,那么不会考虑您的项目。

    阅读实现思想的代码,或者直接使用基于DNS协议上的RFC的Erlang位语法创建DNS协议消息。创建一个DNS包要比解析它容易得多(我自己也经历过这一过程,最小化包大小的“聪明技巧”似乎不值得这样做)。

        3
  •  1
  •   Roberto Aloi    15 年前

    正如麦格纳斯在Erlang问题邮件列表中所解释的:

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

    您在encode/1函数中传递的是dns_查询,而不是dns_rec记录。

    推荐文章