尝试为ipv6添加多播组,但它返回错误。不明白问题。在IPv4中它工作正常不能添加多播组
([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}
遗憾的是这个主题的Erlang文档被严重记录
也试图与像ff3c addrreses:,FF32:
UPDATE 我已经研究过二郎山/ OTP 18.2源代码,有使用功能prim_inet:is_sockopt_val(add_membership, {{65280,0,0,0,0,0,34048,9029}, {0,0,0,0,0,0,0,0}})
它总是返回false,因为在prim_inet:type_value_2/2我们有类型ip,值{_,_,_,_,_,_,_,_}
,它只等待ipv4 {_,_,_,_}
。 一方面我知道为什么不能在打开套接字时添加ipv6的成员资格,但另一方面要做的事情是打开的问题
在第三个数字中,'3'意思是'Realm Local',它尚未定义,等待RFC定义它;你可能想用'2'作为'Admin local'。此外,在第四位数字中,高位必须为'0'(不能大于等于8),并且如果设置了R位,则必须设置“P”位,如果“P '位被置位,必须设置'T'位(数字必须为0,1,3或7)。设置'R'位表示您正在嵌入RP地址。可能的话,你只需要设置'T'位(第四位是'1')来表示一个暂时的,而非永久的,众所周知的地址。这意味着使用'ff21'。 –
@RonMaupin谢谢你的答案:) 我会解决它。但第二个问题是,otp只期望ipv4 addr –
IPv6和IPv4是两个完全独立的第三层协议。任何期望IPv4地址的东西都需要IPv4地址,而不是IPv6地址。我不知道你在用什么,但你必须有一个IPv6网络,包括IPv6多播客户端和源代码。 –