私の最初の REAL Erlang プログラムである私のプログラムは順調にスタートしました。メッセージをリッスンし、読み取り、解析します。私も送ってもらいました。私を悩ませている小さなことは、ポート 5353 で SEND できないことです。すべてを試しました。私のマシン上の他のすべてのアプリケーションは、ポート 5353、SubEthaEdit、iTunes、iChat でリッスンおよび送信できます。
ソリューションは、ポート 5353 でブロードキャスト送信する必要があります。その理由は次のとおりです。
" 受信したマルチキャスト DNS クエリの送信元 UDP ポートがポート 5353 でない場合、これは、クエリを発信したクライアントが、マルチキャスト DNS のすべてを完全に実装していない単純なクライアントであることを示します。この場合、マルチキャスト DNS レスポンダは、クエリ パケットの送信元 IP アドレスとポートへのユニキャストを介して、クライアントに直接返す UDP 応答. このユニキャスト応答は、従来のユニキャスト DNS サーバーによって生成される従来のユニキャスト応答でなければならない. たとえば、クエリ ID を繰り返さなければならない.そしてクエリパケットで与えられた質問。」
それらはすべて、マルチキャスト メッセージの送信時にポート: 5353 を報告します。私は自分のアプリケーションがうまく動作し、同じことをポート 5353 で送信することを本当に望んでいます。これが現在の私のモジュールです。
-module(zeroconf).
-include("zeroconf.hrl").
-export([open/0,start/0]).
-export([stop/1,receiver/0]).
-export([send/1]).
-define(ADDR, {224,0,0,251}).
-define(PORT, 5353).
send(Domain) ->
{ok,S} = gen_udp:open(0,[{broadcast,true}]), % I really want this Port to be 5353 :-(
% this doesn't complain or throw errors but it also doesn't work :-(
%{ok,S} = gen_udp:open(?PORT,[{reuseaddr,true}, {ip,?ADDR}, {broadcast,true},multicast_ttl,4}, {multicast_loop,false}, binary]),
P = #dns_rec{header=#dns_header{},qdlist=[#dns_query{domain=Domain,type=ptr,class=in}]},
gen_udp:send(S,?ADDR,?PORT,inet_dns:encode(P)),
gen_udp:close(S).
出力の一部を次に示します。
これは、ローカル ネットワーク上の他のインスタンスを探している SubEthaEdit からのクエリです。Port: 5353 と表示されていることに注意してください。
From: {192,168,0,105}
Port: 5353
Data: {ok,{dns_rec,{dns_header,0,true,'query',true,false,false,false,false,0},
[],
[{dns_rr,"_see._tcp.local",ptr,in,0,0,
"jhr@Blackintosh._see._tcp.local",undefined,[],
false}],
[],[]}}
ここで、ローカル ネットワーク上の iTunes のインスタンスを検索するモジュールからの QUERY を示します。Port: 59795 と表示されていることに注意してください。現在のコードでは、そのポートはランダムです。どうしても5353にしたいです。
From: {192,168,0,105}
Port: 59795
Data: {ok,{dns_rec,{dns_header,0,false,'query',false,false,false,false,false,
0},
[{dns_query,"_daap._tcp.local",ptr,in}],
[],[],[]}}
UDPマルチキャストについて、難解な洞察を持っている人はいますか? 更新して、回答を受け入れることができるようにします。これしかできないと思います。