我的程序有了一个良好的开端,我的第一个 REAL Erlang 程序。我让它监听消息,阅读它们并解析它们。我也有它发送给他们。困扰我的一件小事是我无法在端口 5353 上发送,我已经尝试了所有方法。我机器上的所有其他应用程序都可以在端口 5353、SubEthaEdit、iTunes、iChat 上监听和发送。
解决方案必须在端口 5353 上广播发送,这就是原因。
" 如果接收到的组播 DNS 查询中的源 UDP 端口不是端口 5353,这表明发起查询的客户端是一个简单的客户端,没有完全实现所有组播 DNS。在这种情况下,组播 DNS 响应程序必须发送一个UDP 响应直接返回客户端,通过单播,到查询数据包的源 IP 地址和端口。此单播响应必须是传统单播 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 实例,请注意它显示端口: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 多播有任何神秘的见解?更新,以便我可以尝试接受答案。我想我不能这样做。