问题描述:使用JGroups编写了一个基于ip_mcast的程序,在同一台机器上能正常运行,在局域网内的两台机器上运行却找不到对方。
1.核对两台机子的ip,确实在同一子网下。
2.查看运行时输出,发现两台机子绑定的ip一个是ipv6,一个是ipv4。把默认绑定ipv6的那台机子修改为它的ipv4地址(-Djgroups.bind_addr=223.3.96.192),再试还是不能相互发现。
3.看了官网manual的"2.8 It doen't work"一章,怀疑学校局域网不支持多播,运行JGroups的tests包下的McastReceiverTest和McastSenderTest,发现多播能正常使用,但Sender发一次消息,Receiver会接收到多次。
4.查看ipconfig,出现几十个地址,包括十几个ipv6的地址。
5.怀疑广播地址或者端口被禁用,在协议栈中配置广播地址和端口,将它们设置为3中证实能使用的地址和端口,仍然没用。
6.安装虚拟机,在本机和虚拟机上执行程序,地址绑定为vmware的虚拟网络地址,仍然不行。
7.安装虚拟机2,在虚拟机1和虚拟机2上执行程序,地址绑定为vmware的虚拟网络地址,居然成功了。
8.实体机上不行,虚拟机上可以,纠结了2天。
9.无意间看了
java -Djava.net.preferIPv4Stack=true org.jgroups.demos.Draw -props /home/bela/udp.xml
The JDK uses IPv6 by default, although is has a dual stack, that is, it also supports IPv4.Here's more details on the subject.
在两台主机上运行,启动时加入
-Djava.net.preferIPv4Stack=true居然成功了。
总结:
1.对官网文档研究不仔细
2.对ipv6不熟,以为2.9章和我的程序没什么关系。
3.分析能力不够,根据测试结果:“本机和另一台机器不成功,本机和虚拟机不成功,虚拟机和虚拟机成功”,应该怀疑是本机的问题。