¿Cómo enviar mensajes multicast y reutilizar un puerto en Erlang?

He tenido un buen comienzo en mi programa, mi primer programa REAL de Erlang. Lo tengo escuchando mensajes, leyéndolos y analizándolos. También lo tengo enviándolos. Lo único que me molesta es que no puedo ENVIAR en el Puerto 5353, lo he intentado todo. Todas las demás aplicaciones en mi máquina pueden escuchar Y enviar en el puerto 5353, SubEthaEdit, iTunes, iChat.

La solución DEBE enviarse en el puerto 5353 y aquí se explica por qué.

"Si el puerto UDP de origen en una consulta DNS de multidifusión recibida no es el puerto 5353, esto indica que el cliente que originó la consulta es un cliente simple que no implementa completamente todo el DNS de multidifusión. En este caso, el Respondedor de DNS de multidifusión DEBE enviar un La respuesta UDP vuelve directamente al cliente, mediante unidifusión, a la dirección IP y el puerto de origen del paquete de consulta. Esta respuesta DEBEN ser una respuesta de unidifusión convencional como la generaría un servidor DNS de unidifusión convencional; por ejemplo, DEBE repetir la ID de la consulta y la pregunta dada en el paquete de consulta ".

Todos reportan Puerto: 5353 cuando envían mensajes de multidifusión. Realmente quiero que mi aplicación juegue bien y haga lo mismo, envíe en el Puerto 5353. Aquí está mi módulo tal como está ahora.

-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).

Esto es lo que parece una salida.

Esta es una CONSULTA de SubEthaEdit buscando otras instancias en la red local, observe que dice Puerto: 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}],
                   [],[]}}

Ahora aquí está una consulta de mi módulo en busca de instancias de iTunes en la red local, observe que dice Puerto: 59795 Con el código tal como está ahora, ese puerto es aleatorio. Realmente quiero que sea 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}],
                   [],[],[]}}

¿Alguien tiene algún conocimiento arcano de la multidifusión UDP? Actualización para que pueda intentar y aceptar una respuesta. Creo que no puedo hacer esto.

Respuestas a la pregunta(3)

Su respuesta a la pregunta