我在使用 Ubuntu 14.04 设置 IPv6 多播服务器时遇到了麻烦,当尝试绑定到 IPv6 多播地址时,服务器因参数无效而失败,使用 mcfirst 工具检查后发现出现相同的错误。
mcfirst -6 ff01::1:1 10000
bind [multicast]: Invalid argument
errno=22
这与 Ubuntu 12.04 完美兼容
mcfirst -6 ff01::1:1 10000
mcfirst joined (*,G) = (*,ff01::1:1)
编辑:1(Ifconfig 输出)
eth0 Link encap:Ethernet HWaddr 00:0c:29:53:a1:fb
inet addr:192.168.50.5 Bcast:192.168.50.255 Mask:255.255.255.0
inet6 addr: fe80::20c:29ff:fe53:a1fb/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:22424 errors:0 dropped:0 overruns:0 frame:0
TX packets:11825 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:29238784 (29.2 MB) TX bytes:1061497 (1.0 MB)
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:65536 Metric:1
RX packets:1838133 errors:0 dropped:0 overruns:0 frame:0
TX packets:1838133 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:1026295857 (1.0 GB) TX bytes:1026295857 (1.0 GB)
编辑:2(ip 地址)输出
1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default
link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
inet 127.0.0.1/8 scope host lo
valid_lft forever preferred_lft forever
inet6 ::1/128 scope host
valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc pfifo_fast state UP group default qlen 1000
link/ether 00:0c:29:53:a1:fb brd ff:ff:ff:ff:ff:ff
inet 192.168.50.5/24 brd 192.168.50.255 scope global eth0
valid_lft forever preferred_lft forever
inet6 fe80::20c:29ff:fe53:a1fb/64 scope link
valid_lft forever preferred_lft forever
答案1
将 IPv6 链路本地地址、多播链路本地地址或多播节点本地地址绑定到 IPv6 套接字时,内核需要一个范围标识符。
这些语法例如是ff01::1:1%eth0
。请确保您的应用程序正确支持它们。此语法由支持getaddressinfo()
,因此正确编写的应用程序应该没有任何问题。
此行为在低于 3.10 的内核版本中不存在,显然无法正确处理节点本地多播。请参阅实际的内核补丁可以执行此操作和函数定义__ipv6_addr_needs_scope_id
。