2009-11-16 6 views
6

본래의 Bonjour/Zeroconf 라이브러리를 구축 중이며 DNS 쿼리 레코드를 만들어 다른 컴퓨터로 브로드 캐스팅해야합니다. Erlang 소스 코드를 조사해 보았습니다. 그러나 Erlang에 비교적 익숙하지 않았기 때문에 모든 inet_XXX.erl 및 .hrl 파일의 내부가 밀집 해졌습니다. DNS 레코드 페이로드를 수신하고 구문 분석하기 위해 작동하는 수신기가 있습니다. 쿼리 레코드를 만드는 방법을 파악할 수 없습니다. 내가 정말로 알아야 할 것은 inet_dns에 전달할 필요가있는 것입니다. encode()를 보내면 바이너리를 보낼 수 있습니다. 여기 내가하려는 일이 있습니다. 여기 Erlang에서 DNS 쿼리 레코드를 작성하려면 어떻게해야합니까?

{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

나는 그것을 마침내 발견했습니다. 메일 링리스트 얼랑 질문에 매그너스에 의해 설명 된 바와 같이

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