On Fri, 29 Jan 2021 12:31:04 GMT, Daniel Fuchs <dfu...@openjdk.org> wrote:

>> DatagramSocket has a DatagramSocket.setDatagramSocketImplFactory method that 
>> allows to globally replace the default DatagramSocket/MulticastSocket 
>> implementation provided by the JDK. This was provided as a way in early JDK 
>> releases to replace the system wide implementation. It has been mostly 
>> obsolete since Java 1.4. A DatagramSocket can be created to use a custom 
>> implementation by extending DatagramSocket and using the protected 
>> constructor that takes the impl as a parameter. However, MulticastSocket 
>> doesn't provide such a constructor.
>> 
>> Though DatagramSocket can be subclassed to provide a custom implementation, 
>> MulticastSocket, if subclassed, will still create its default 
>> implementation, even when all methods of MulticastSocket are overridden in 
>> order not to use it. This will create a file descriptor / socket leak.
>> 
>> The only solution to avoid that is currently to replace the default 
>> DatagramSocketImplFactory by calling the static 
>> DatagramSocket.setDatagramSocketImplFactory. We need a better solution.
>> 
>> The solution proposed in this RFE is to allow DatagramSocket to both send 
>> and receive multicast datagrams. DatagramSocket has always had the ability 
>> to send multicast packets. In Java 15, DatagramSocket has been improved to 
>> support getting/setting multicast options. This change proposes to move 
>> `joinGroup(SocketAddress, NetworkInterface)` and `leaveGroup(SocketAddress, 
>> NetworkInterface)` up from MulticastSocket into DatagramSocket.
>> 
>> An application that needs to completely replace the default multicast 
>> implementation, and that cannot be easily updated to use DatagramChannel, 
>> can do so by subclassing DatagramSocket instead.
>> 
>> In addition, this change improves the documentation of DatagramSocket and 
>> MulticastSocket to show how convenience getters/setters map to 
>> StandardSocketOptions, and adds an `@apiNote` to show how DatagramSocket can 
>> be used for multicasting.
>> 
>> Specdiff can be seen here:
>> http://cr.openjdk.java.net/~dfuchs/ds-ms-8237352-specdiff.07/overview-summary.html
>
> Daniel Fuchs has updated the pull request incrementally with one additional 
> commit since the last revision:
> 
>   8237352: Evaluate how to write a custom DatagramSocket/MulticastSocket 
> without using DatagramSocketImplFactory

src/java.base/windows/classes/java/net/DefaultDatagramSocketImplFactory.java 
line 102:

> 100:             // Always use TwoStacksPlainDatagramSocketImpl since we need
> 101:             // to support multicasting at DatagramSocket level
> 102:             return new TwoStacksPlainDatagramSocketImpl(exclusiveBind && 
> !isMulticast, isMulticast);

DualStackPlainDatagramSocketImpl will be orphaned, are you proposing to keeping 
it? At some point all of the old implementation will be removed anyway so maybe 
it will be removed then?

-------------

PR: https://git.openjdk.java.net/jdk/pull/2312

Reply via email to