2016-07-14 17 views
3

Der Versuch, Multicast-Gruppe für IPv6 hinzuzufügen, aber Fehler zurückgegeben. verstehe das Problem nicht. mit ipv4 funktioniert eskann keine Multicast-Gruppe hinzufügen

([email protected])1> {ok, S} = gen_udp:open(3333, [binary, {active, false}, {ip, {65342,0,0,0,0,0,34048,9029}}, inet6, {multicast_loop, false}]). 
{ok,#Port<0.1587>} 

([email protected])4> inet:setopts(S, [{add_membership, {{65342,0,0,0,0,0,0,0}, {0,0,0,0,0,0,0,0}}}]). 
{error,einval} 

leider dieses Thema in erlang docs fein ist schlecht dokumentiert

haben auch mit addrreses wie ff3c versucht:, FF32:

UPDATE i in Erlang haben gesucht/OTP 18.2 Quelltext, es gibt die Funktion prim_inet:is_sockopt_val(add_membership, {{65280,0,0,0,0,0,34048,9029}, {0,0,0,0,0,0,0,0}})

und es gibt immer false zurück, weil in prim_inet: type_value_2/2 haben wir Typ IP, Wert {_,_,_,_,_,_,_,_} und es wartet nur auf ipv4 {_,_,_,_}. auf der einen Seite weiß ich, warum Mitgliedschaft nicht mit ipv6 hinzufügen kann, wenn geöffnet Steckdose, aber auf der anderen Seite was zu tun ist Frage

+0

In der dritten Ziffer bedeutet "3" derzeit "Realm Local", was noch undefiniert ist, bis ein RFC definiert wird; Sie können '2' für' Admin local' verwenden. Außerdem muss in der vierten Ziffer das höherwertige Bit "0" sein (kann nicht "8" oder größer sein), und wenn das "R" -Bit gesetzt ist, muss das "P" -Bit gesetzt werden, und wenn der "P" -Bit gesetzt ist Wenn das Bit gesetzt ist, muss das Bit "T" gesetzt werden (die Ziffer muss "0", "1", "3" oder "7" sein). Wenn das Bit "R" gesetzt ist, bedeutet das, dass Sie eine RP-Adresse einbetten. Wahrscheinlich wollen Sie nur das Bit 'T' gesetzt (vierte Ziffer ist '1'), um eine vorübergehende, nicht dauerhafte, wohlbekannte Adresse anzuzeigen. Das würde bedeuten, "ff21" zu verwenden. –

+0

@RonMaupin danke für die Antwort :) ich werde es beheben. aber das zweite Problem ist, dass otp erwartet nur IPv4 addr –

+0

IPv6 und IPv4 sind zwei völlig separate Schicht-3-Protokolle. Alles, was eine IPv4-Adresse erwartet, benötigt eine IPv4-Adresse und keine IPv6-Adresse. Ich weiß nicht, was Sie verwenden, aber Sie müssen ein IPv6-Netzwerk haben, einschließlich IPv6-Multicast-Clients und -Quelle. –

Antwort

2

Es sieht nicht aus wie Erlangs Treiber implementiert IPV6_ADD_MEMBERSHIP, aber es hat roh Unterstützung, damit Sie es selbst konstruieren können. Ein Problem bei diesem Ansatz besteht darin, dass Sie Dinge, die normalerweise in Headerdateien definiert sind, hart codieren, sodass Ihre Lösung nicht sehr portabel ist.

-module(unssmraw). 
-export([test/0]). 


test() -> 
    Port = 57100, 
    Mad = <<65340:16,0:16,0:16,0:16,0:16,0:16,34048:16,9029:16>>, 
    Ifindx = <<3:64>>, 
    Ip6 = 41, 
    Ip6am = 20, 

    {ok, Sock} = gen_udp:open(Port, [{reuseaddr,true}, inet6, binary]), 
    R3 = inet:setopts(Sock, [{raw, Ip6, Ip6am, <<Mad/binary, Ifindx/binary>> }]), 
    io:format("ssm ok? ~w ~n", [R3]), 
    receive 
    {udp, S, A, Pr, Pk} -> io:format("watcher sees: Socket ~p Address ~p Port ~p Packet ~p ~n", [S, A, Pr, Pk]) end. 

Beispiel Test Absender:

echo hi | socat - UDP6-SENDTO:\"ff3c::8500:2345\":57100 

Beispiel laufen:

$ erl 
Erlang/OTP 19 [erts-8.0.1] [source-761e467] [64-bit] [smp:2:2] [async-threads:10] [hipe] [kernel-poll:false] 

Eshell V8.0.1 (abort with ^G) 
1> unssmraw:test(). 
ssm ok? ok 
watcher sees: Socket #Port<0.453> Address {65152,0,0,0,47734,16383,65066, 
              19977} Port 43511 Packet <<"hi\n">> 
ok 

Hinweise zu meinen fest einprogrammierten Werten

  • Wie der Schnittstellenindex I in Ifindx verwenden zu finden ist beschriebenundist 64-Bit denn das ist die Größe eines int auf meinem System und es ist ein int in mreq in meinem in6.h.)
  • Ip6 ‚s-Wert von in.h
  • Ip6am ist IPV6_ADD_MEMBERSHIP aus in6.h.
+0

danke! es ist, was ich suche –