Yasumasa, To allow multiple application to use the same *multicast* address:port you probably just need to move
channel.setOption(StandardSocketOptions.SO_REUSEADDR, true); before bind. As for bind call lets leave this question out of scope of these two fixes. Different OS'es behave differently and I need to check it before we can go further. I'll come back later and file a separate CR if necessary. -Dmitry On 2014-09-09 07:45, Yasumasa Suenaga wrote: >> Bind call is required to listen on particular address. So please, keep >> it. > > I think JdpBroadcaster need not to call bind(). > bind() binds address to application, so another application on same host > cannot use JDP. > > I've changed JdpBroadcaster as below: > ----------- > diff -r 68a6bb51cb26 > src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java > --- > a/src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java > Mon Sep 01 13:33:28 2014 +0200 > +++ > b/src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java > Tue Sep 09 12:27:33 2014 +0900 > @@ -79,11 +79,7 @@ > if (srcAddress != null) { > // User requests particular interface to bind to > NetworkInterface interf = > NetworkInterface.getByInetAddress(srcAddress); > - try { > - channel.bind(new InetSocketAddress(srcAddress, 0)); > - } catch (UnsupportedAddressTypeException ex) { > - throw new JdpException("Unable to bind to source > address"); > - } > + channel.setOption(StandardSocketOptions.SO_REUSEADDR, true); > channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, > interf); > } > } > ----------- > > I ran two JVMs as below: > ----------- > java -Dcom.sun.management.jmxremote.port=<port> > -Dcom.sun.management.jmxremote.authenticate=false > -Dcom.sun.management.jmxremote.ssl=false > -Dcom.sun.management.jmxremote.autodiscovery=true > -Dcom.sun.management.jdp.source_addr=<IP> <Long sleep application> > ----------- > > Both JVM instances could send JDP packet. > I checked it with tcpdump and my JDP receiver application. > > > If you keep bind() call, JDP broadcaster only exists one instance > on same host. > I think JDP should be used by multiple JVM instance on same host. > > > Thanks, > > Yasumasa > > > (2014/09/09 0:48), Dmitry Samersoff wrote: >> Jaroslav, >> >>> L96-100 Do we still need these lines? Isn't >>> `channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, interf);` >>> enough to listen on the interface? >> >> Bind call is required to listen on particular address. So please, keep >> it. >> >> -Dmitry >> >> >> On 2014-09-08 14:12, Jaroslav Bachorik wrote: >>> Hi Yasamusa, >>> >>> On 09/05/2014 12:28 PM, Yasumasa Suenaga wrote: >>>> Hi Peter, >>>> >>>> I fixed it and created new webrev. >>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8057556/webrev.1/ >>>> >>>> Could you review it again? >>> >>> Just a few nits ... >>> >>> L103 Please, move "else" to the previous line >>> L96-100 Do we still need these lines? Isn't >>> `channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, interf);` >>> enough to listen on the interface? >>> >>> -JB- >>> >>>> >>>> >>>> Thanks, >>>> >>>> Yasumasa >>>> >>>> >>>> (2014/09/05 17:20), Peter Allwin wrote: >>>>> Looks like only the first Interface will be considered if no >>>>> srcAddress is provided (succeeded will be false and we will throw to >>>>> exit the while loop). Is this intended? >>>>> >>>>> Thanks! >>>>> /peter >>>>> >>>>>> On 4 sep 2014, at 17:59, Yasumasa Suenaga <yasue...@gmail.com> wrote: >>>>>> >>>>>> Hi all, >>>>>> >>>>>> Thank you so much, Dmitry! >>>>>> >>>>>> I've created webrev for it. >>>>>> http://cr.openjdk.java.net/~ysuenaga/JDK-8057556/webrev.0/ >>>>>> >>>>>> Please review. >>>>>> >>>>>> >>>>>> Thanks, >>>>>> >>>>>> Yasumasa >>>>>> >>>>>> >>>>>> (2014/09/04 21:26), Dmitry Samersoff wrote: >>>>>>> Yasumasa, >>>>>>> >>>>>>> The CR number is JDK-8057556 >>>>>>> >>>>>>> I'll care about it's integration. >>>>>>> >>>>>>> -Dmitry >>>>>>> >>>>>>>> On 2014-09-02 18:52, Yasumasa Suenaga wrote: >>>>>>>> Hi all, >>>>>>>> >>>>>>>> I'm trying to use JDP on my Fedora20 machine. >>>>>>>> My machine has two NICs and only one NIC is up. >>>>>>>> >>>>>>>> I passed system properties as below, however JDP broadcaster >>>>>>>> thread was not started: >>>>>>>> >>>>>>>> -Dcom.sun.management.jmxremote.port=7091 >>>>>>>> -Dcom.sun.management.jmxremote.authenticate=false >>>>>>>> -Dcom.sun.management.jmxremote.ssl=false >>>>>>>> -Dcom.sun.management.jmxremote.autodiscovery=true >>>>>>>> -Dcom.sun.management.jdp.name=TEST >>>>>>>> >>>>>>>> I checked exceptions with jdb, SocketException was occurred in >>>>>>>> JDPControllerRunner#run(), and it was caused by another NIC >>>>>>>> is down. >>>>>>>> >>>>>>>> Currently, DiagramChannel which is used in JDPBroadcaster >>>>>>>> tries to send JDP packet through all "UP" NICs. >>>>>>>> However, NIC which is controlled by NetworkManager seems to >>>>>>>> be still "UP" when ifdown command is executed. >>>>>>>> (It seems to be removed IP address from NIC only.) >>>>>>>> >>>>>>>> >>>>>>>> This problem may be Fedora, however I think it should be >>>>>>>> improved in JDK. >>>>>>>> I've created a patch as below, and it works fine in my environment. >>>>>>>> (jdk9/dev/jdk) >>>>>>>> >>>>>>>> If this patch may be accepted, I will file this to JBS. >>>>>>>> >>>>>>>> -------------------- >>>>>>>> diff -r 68a6bb51cb26 >>>>>>>> src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java >>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> --- >>>>>>>> a/src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java >>>>>>>> >>>>>>>> >>>>>>>> Mon Sep 01 13:33:28 2014 +0200 >>>>>>>> +++что случилось с go contacts >>>>>>>> b/src/java.management/share/classes/sun/management/jdp/JdpBroadcaster.java >>>>>>>> >>>>>>>> >>>>>>>> Tue Sep 02 23:25:50 2014 +0900 >>>>>>>> @@ -35,6 +35,7 @@ >>>>>>>> import java.nio.ByteBuffer; >>>>>>>> import java.nio.channels.DatagramChannel; >>>>>>>> import java.nio.channels.UnsupportedAddressTypeException; >>>>>>>> +import java.util.Enumeration; >>>>>>>> >>>>>>>> /** >>>>>>>> * JdpBroadcaster is responsible for sending pre-built JDP >>>>>>>> packet >>>>>>>> across a Net >>>>>>>> @@ -79,6 +80,15 @@ >>>>>>>> if (srcAddress != null) { >>>>>>>> // User requests particular interface to bind to >>>>>>>> NetworkInterface interf = >>>>>>>> NetworkInterface.getByInetAddress(srcAddress); >>>>>>>> + >>>>>>>> + if (interf == null) { >>>>>>>> + throw new JdpException("Unable to get network >>>>>>>> interface for " + srcAddress.toString()); >>>>>>>> + } >>>>>>>> + >>>>>>>> + if (!interf.isUp() || !interf.supportsMulticast()) { >>>>>>>> + throw new JdpException(interf.getName() + " does >>>>>>>> not support multicast."); >>>>>>>> + } >>>>>>>> + >>>>>>>> try { >>>>>>>> channel.bind(new >>>>>>>> InetSocketAddress(srcAddress, 0)); >>>>>>>> } catch (UnsupportedAddressTypeException ex) { >>>>>>>> @@ -86,6 +96,23 @@ >>>>>>>> } >>>>>>>> >>>>>>>> channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, interf); >>>>>>>> } >>>>>>>> + else { >>>>>>>> + Enumeration<NetworkInterface> nics = >>>>>>>> NetworkInterface.getNetworkInterfaces(); >>>>>>>> + while (nics.hasMoreElements()) { >>>>>>>> + NetworkInterface nic = nics.nextElement(); >>>>>>>> + >>>>>>>> + if (nic.isUp() && nic.supportsMulticast()) { >>>>>>>> + try { >>>>>>>> + >>>>>>>> channel.setOption(StandardSocketOptions.IP_MULTICAST_IF, nic); >>>>>>>> + } catch (IOException ex) { >>>>>>>> + System.err.println("WARNING: JDP >>>>>>>> broadcaster cannot use " + nic.getName() + ": " + ex.getMessage()); >>>>>>>> + } >>>>>>>> + } >>>>>>>> + >>>>>>>> + } >>>>>>>> + >>>>>>>> + } >>>>>>>> + >>>>>>>> } >>>>>>>> >>>>>>>> /** >>>>>>>> -------------------- >>>>>>>> >>>>>>>> >>>>>>>> Thanks, >>>>>>>> >>>>>>>> Yasumasa >>>>>>> >>>>>>> >>> >> >> -- Dmitry Samersoff Oracle Java development team, Saint Petersburg, Russia * I would love to change the world, but they won't give me the sources.