2015-05-31 24 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());

相關問題