2015-05-31 23 views
0

当使用Java的多播套接字我可以加入组播组,而无需使用此代码指定NetworkInterface加入使用DatagramChannel组播组,而无需指定网络接口

MulticastSocket sock = new MulticastSocket(PORT); 
sock.joinGroup(ADDR); 

如果我想使用NIO,另一方面我可以这样做:

DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET) 
     .setOption(StandardSocketOptions.SO_REUSEADDR, true) 
     .bind(new InetSocketAddress(PORT)) 
     .setOption(StandardSocketOptions.IP_MULTICAST_IF, IFC); 

dc.join(ADDR, IFC); 

其中IFCNetworkInterface我感兴趣的。 如果我不知道网络接口事先我如何才能加入一个组织想与MulticastSocket?

一个解决方案,我发现使用此代码:

MulticastSocket msock = new MulticastSocket(); 
NetworkInterface ifc = msock.getNetworkInterface(); 
msock.close(); 
DatagramChannel dc = DatagramChannel.open(StandardProtocolFamily.INET) 
     .setOption(StandardSocketOptions.SO_REUSEADDR, true) 
     .bind(new InetSocketAddress(PORT)) 
     .setOption(StandardSocketOptions.IP_MULTICAST_IF, ifc); 

dc.join(ADDR, ifc); 

令人惊讶此代码的工作,并执行不如预期,当查看MulticastSocket.getNetworkInterface()方法返回的NetworkInterface时,我发现它返回了一个名为“0.0.0.0”的接口,当然这个接口不存在。此外,没有办法获得这个网络接口的任何NetworkInterface.*工厂

该解决方案是否可靠?任何人都可以解释为什么它有效,如果有更好的方法来实现我想要的?

+0

哈瓦这里看看http://stackoverflow.com/questions/19392173/multicastsocket-constructors-and-binding-to-port-or-socketaddress – Shar1er80

+0

那么明显'MulticastSocket.getNetworkInterface()'返回神奇的'0.0.0.0 NetworkInterface'你不能得到任何其他的方式。如果你调用了'MulticastSocket.setNetworkInterface()',它就不会这么做。很奇怪NIO版本没有单参数'join()'方法。 – EJP

回答

0

我用本地地址可以找到局域网设备!所以你可以试试它! 如 NetworkInterface IFC = NetworkInterface.getByInetAddress(InetAddress.getLocalHost());

相关问题