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()) |
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) { |