src/java.base/share/classes/java/net/AbstractPlainDatagramSocketImpl.java
changeset 59200 a686b67a59d9
parent 55693 9a97b1393e72
child 59224 55fdee124e89
equal deleted inserted replaced
59199:a096dfdcabde 59200:a686b67a59d9
    52     int timeout = 0;
    52     int timeout = 0;
    53     boolean connected = false;
    53     boolean connected = false;
    54     private int trafficClass = 0;
    54     private int trafficClass = 0;
    55     protected InetAddress connectedAddress = null;
    55     protected InetAddress connectedAddress = null;
    56     private int connectedPort = -1;
    56     private int connectedPort = -1;
       
    57     private final boolean isMulticast;
    57 
    58 
    58     private static final String os =
    59     private static final String os =
    59             GetPropertyAction.privilegedGetProperty("os.name");
    60             GetPropertyAction.privilegedGetProperty("os.name");
    60 
    61 
    61     /**
    62     /**
    80         if (!checkedReusePort) {
    81         if (!checkedReusePort) {
    81             isReusePortAvailable = isReusePortAvailable0();
    82             isReusePortAvailable = isReusePortAvailable0();
    82             checkedReusePort = true;
    83             checkedReusePort = true;
    83         }
    84         }
    84         return isReusePortAvailable;
    85         return isReusePortAvailable;
       
    86     }
       
    87 
       
    88     AbstractPlainDatagramSocketImpl(boolean isMulticast) {
       
    89         this.isMulticast = isMulticast;
    85     }
    90     }
    86 
    91 
    87     /**
    92     /**
    88      * Creates a datagram socket
    93      * Creates a datagram socket
    89      */
    94      */
   404     private static Set<SocketOption<?>> datagramSocketOptions() {
   409     private static Set<SocketOption<?>> datagramSocketOptions() {
   405         HashSet<SocketOption<?>> options = new HashSet<>();
   410         HashSet<SocketOption<?>> options = new HashSet<>();
   406         options.add(StandardSocketOptions.SO_SNDBUF);
   411         options.add(StandardSocketOptions.SO_SNDBUF);
   407         options.add(StandardSocketOptions.SO_RCVBUF);
   412         options.add(StandardSocketOptions.SO_RCVBUF);
   408         options.add(StandardSocketOptions.SO_REUSEADDR);
   413         options.add(StandardSocketOptions.SO_REUSEADDR);
       
   414         options.add(StandardSocketOptions.SO_BROADCAST);
   409         options.add(StandardSocketOptions.IP_TOS);
   415         options.add(StandardSocketOptions.IP_TOS);
   410         if (isReusePortAvailable())
   416         if (isReusePortAvailable())
   411             options.add(StandardSocketOptions.SO_REUSEPORT);
   417             options.add(StandardSocketOptions.SO_REUSEPORT);
   412         options.addAll(ExtendedSocketOptions.datagramSocketOptions());
   418         options.addAll(ExtendedSocketOptions.datagramSocketOptions());
   413         return Collections.unmodifiableSet(options);
   419         return Collections.unmodifiableSet(options);
   416     private static Set<SocketOption<?>> multicastSocketOptions() {
   422     private static Set<SocketOption<?>> multicastSocketOptions() {
   417         HashSet<SocketOption<?>> options = new HashSet<>();
   423         HashSet<SocketOption<?>> options = new HashSet<>();
   418         options.add(StandardSocketOptions.SO_SNDBUF);
   424         options.add(StandardSocketOptions.SO_SNDBUF);
   419         options.add(StandardSocketOptions.SO_RCVBUF);
   425         options.add(StandardSocketOptions.SO_RCVBUF);
   420         options.add(StandardSocketOptions.SO_REUSEADDR);
   426         options.add(StandardSocketOptions.SO_REUSEADDR);
       
   427         options.add(StandardSocketOptions.SO_BROADCAST);
   421         options.add(StandardSocketOptions.IP_TOS);
   428         options.add(StandardSocketOptions.IP_TOS);
   422         options.add(StandardSocketOptions.IP_MULTICAST_IF);
   429         options.add(StandardSocketOptions.IP_MULTICAST_IF);
   423         options.add(StandardSocketOptions.IP_MULTICAST_TTL);
   430         options.add(StandardSocketOptions.IP_MULTICAST_TTL);
   424         options.add(StandardSocketOptions.IP_MULTICAST_LOOP);
   431         options.add(StandardSocketOptions.IP_MULTICAST_LOOP);
   425         if (isReusePortAvailable())
   432         if (isReusePortAvailable())
   428         return Collections.unmodifiableSet(options);
   435         return Collections.unmodifiableSet(options);
   429     }
   436     }
   430 
   437 
   431     @Override
   438     @Override
   432     protected Set<SocketOption<?>> supportedOptions() {
   439     protected Set<SocketOption<?>> supportedOptions() {
   433         if (getDatagramSocket() instanceof MulticastSocket)
   440         if (isMulticast)
   434             return multicastSocketOptions;
   441             return multicastSocketOptions;
   435         else
   442         else
   436             return datagramSocketOptions;
   443             return datagramSocketOptions;
   437     }
   444     }
   438 
   445 
   458             setOption(SocketOptions.SO_RCVBUF, value);
   465             setOption(SocketOptions.SO_RCVBUF, value);
   459         } else if (name == StandardSocketOptions.SO_REUSEADDR) {
   466         } else if (name == StandardSocketOptions.SO_REUSEADDR) {
   460             setOption(SocketOptions.SO_REUSEADDR, value);
   467             setOption(SocketOptions.SO_REUSEADDR, value);
   461         } else if (name == StandardSocketOptions.SO_REUSEPORT) {
   468         } else if (name == StandardSocketOptions.SO_REUSEPORT) {
   462             setOption(SocketOptions.SO_REUSEPORT, value);
   469             setOption(SocketOptions.SO_REUSEPORT, value);
       
   470         } else if (name == StandardSocketOptions.SO_BROADCAST) {
       
   471             setOption(SocketOptions.SO_BROADCAST, value);
   463         } else if (name == StandardSocketOptions.IP_TOS) {
   472         } else if (name == StandardSocketOptions.IP_TOS) {
   464             int i = ((Integer)value).intValue();
   473             int i = ((Integer)value).intValue();
   465             if (i < 0 || i > 255)
   474             if (i < 0 || i > 255)
   466                 throw new IllegalArgumentException("Invalid IP_TOS value: " + value);
   475                 throw new IllegalArgumentException("Invalid IP_TOS value: " + value);
   467             setOption(SocketOptions.IP_TOS, value);
   476             setOption(SocketOptions.IP_TOS, value);
   497             return (T) getOption(SocketOptions.SO_RCVBUF);
   506             return (T) getOption(SocketOptions.SO_RCVBUF);
   498         } else if (name == StandardSocketOptions.SO_REUSEADDR) {
   507         } else if (name == StandardSocketOptions.SO_REUSEADDR) {
   499             return (T) getOption(SocketOptions.SO_REUSEADDR);
   508             return (T) getOption(SocketOptions.SO_REUSEADDR);
   500         } else if (name == StandardSocketOptions.SO_REUSEPORT) {
   509         } else if (name == StandardSocketOptions.SO_REUSEPORT) {
   501             return (T) getOption(SocketOptions.SO_REUSEPORT);
   510             return (T) getOption(SocketOptions.SO_REUSEPORT);
       
   511         } else if (name == StandardSocketOptions.SO_BROADCAST) {
       
   512             return (T) getOption(SocketOptions.SO_BROADCAST);
   502         } else if (name == StandardSocketOptions.IP_TOS) {
   513         } else if (name == StandardSocketOptions.IP_TOS) {
   503             return (T) getOption(SocketOptions.IP_TOS);
   514             return (T) getOption(SocketOptions.IP_TOS);
   504         } else if (name == StandardSocketOptions.IP_MULTICAST_IF) {
   515         } else if (name == StandardSocketOptions.IP_MULTICAST_IF) {
   505             return (T) getOption(SocketOptions.IP_MULTICAST_IF2);
   516             return (T) getOption(SocketOptions.IP_MULTICAST_IF2);
   506         } else if (name == StandardSocketOptions.IP_MULTICAST_TTL) {
   517         } else if (name == StandardSocketOptions.IP_MULTICAST_TTL) {