Wie kann ich Multicast-Nachrichten senden und einen Port in Erlang wiederverwenden?

Ich habe einen guten Start in mein Programm bekommen, mein erstes REAL Erlang Programm. Ich habe es auf Nachrichten zu hören, sie zu lesen und sie zu analysieren. Ich habe sie auch geschickt. Das einzige, was mich stört, ist, dass ich auf Port 5353 nicht SENDEN kann. Ich habe alles versucht. Alle anderen Anwendungen auf meinem Computer können über Port 5353, SubEthaEdit, iTunes, iChat empfangen UND senden.

Die Lösung muss auf Port 5353 senden und hier ist, warum.

"Wenn der UDP-Quellport in einer empfangenen Multicast-DNS-Abfrage nicht Port 5353 ist, bedeutet dies, dass der Client, von dem die Abfrage stammt, ein einfacher Client ist, der Multicast-DNS nicht vollständig implementiert. In diesem Fall MUSS der Multicast-DNS-Responder a senden UDP-Antwort direkt an den Client über Unicast an die Quell-IP-Adresse und den Quell-Port des Abfragepakets.Diese Unicast-Antwort MUSS eine herkömmliche Unicast-Antwort sein, wie sie von einem herkömmlichen Unicast-DNS-Server generiert wird, z und die im Abfragepaket angegebene Frage. "

Sie alle melden Port: 5353 beim Senden von Multicast-Nachrichten. Ich möchte wirklich, dass meine Anwendung gut läuft und dasselbe tut. Senden Sie sie auf Port 5353. Hier ist mein Modul, wie es jetzt ist.

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

So sieht eine Ausgabe aus.

Dies ist eine ABFRAGE von SubEthaEdit, die nach anderen Instanzen im lokalen Netzwerk sucht. Beachten Sie, dass dort Port: 5353 steht

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}],
                   [],[]}}

Hier ist eine Abfrage von meinem Modul, die nach Instanzen von iTunes im lokalen Netzwerk sucht. Beachten Sie, dass dort Port: 59795 steht. Bei dem Code, wie er jetzt ist, ist dieser Port zufällig. Ich möchte wirklich, dass es 5353 ist.

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}],
                   [],[],[]}}

Hat jemand einen geheimen Einblick in UDP-Multicast überhaupt? Aktualisierung, damit ich versuchen kann, eine Antwort zu akzeptieren. Ich glaube, ich kann das einfach nicht.

Antworten auf die Frage(3)

Ihre Antwort auf die Frage