10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package java.net;
26
27 import java.io.IOException;
28 import java.util.Set;
29 import java.util.HashSet;
30 import sun.net.ext.ExtendedSocketOptions;
31
32 /*
33 * On Unix systems we simply delegate to native methods.
34 *
35 * @author Chris Hegarty
36 */
37
38 class PlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
39 {
40 static {
41 init();
42 }
43
44 static final ExtendedSocketOptions extendedOptions =
45 ExtendedSocketOptions.getInstance();
46
47 protected <T> void setOption(SocketOption<T> name, T value) throws IOException {
48 if (!extendedOptions.isOptionSupported(name)) {
49 if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
68 if (!extendedOptions.isOptionSupported(name)) {
69 if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
70 return super.getOption(name);
71 } else {
72 if (supportedOptions().contains(name)) {
73 return super.getOption(name);
74 } else {
75 throw new UnsupportedOperationException("unsupported option");
76 }
77 }
78 } else {
79 if (isClosed()) {
80 throw new SocketException("Socket closed");
81 }
82 return (T) extendedOptions.getOption(fd, name);
83 }
84 }
85
86 protected Set<SocketOption<?>> supportedOptions() {
87 HashSet<SocketOption<?>> options = new HashSet<>(super.supportedOptions());
88 options.addAll(extendedOptions.options());
89 return options;
90 }
91
92 protected void socketSetOption(int opt, Object val) throws SocketException {
93 if (opt == SocketOptions.SO_REUSEPORT &&
94 !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) {
95 throw new UnsupportedOperationException("unsupported option");
96 }
97 try {
98 socketSetOption0(opt, val);
99 } catch (SocketException se) {
100 if (!connected)
101 throw se;
102 }
103 }
104
105 protected synchronized native void bind0(int lport, InetAddress laddr)
106 throws SocketException;
107
108 protected native void send(DatagramPacket p) throws IOException;
109
|
10 *
11 * This code is distributed in the hope that it will be useful, but WITHOUT
12 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
13 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
14 * version 2 for more details (a copy is included in the LICENSE file that
15 * accompanied this code).
16 *
17 * You should have received a copy of the GNU General Public License version
18 * 2 along with this work; if not, write to the Free Software Foundation,
19 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
20 *
21 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
22 * or visit www.oracle.com if you need additional information or have any
23 * questions.
24 */
25 package java.net;
26
27 import java.io.IOException;
28 import java.util.Set;
29 import java.util.HashSet;
30 import java.util.Iterator;
31 import sun.net.ext.ExtendedSocketOptions;
32
33 /*
34 * On Unix systems we simply delegate to native methods.
35 *
36 * @author Chris Hegarty
37 */
38
39 class PlainDatagramSocketImpl extends AbstractPlainDatagramSocketImpl
40 {
41 static {
42 init();
43 }
44
45 static final ExtendedSocketOptions extendedOptions =
46 ExtendedSocketOptions.getInstance();
47
48 protected <T> void setOption(SocketOption<T> name, T value) throws IOException {
49 if (!extendedOptions.isOptionSupported(name)) {
50 if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
69 if (!extendedOptions.isOptionSupported(name)) {
70 if (!name.equals(StandardSocketOptions.SO_REUSEPORT)) {
71 return super.getOption(name);
72 } else {
73 if (supportedOptions().contains(name)) {
74 return super.getOption(name);
75 } else {
76 throw new UnsupportedOperationException("unsupported option");
77 }
78 }
79 } else {
80 if (isClosed()) {
81 throw new SocketException("Socket closed");
82 }
83 return (T) extendedOptions.getOption(fd, name);
84 }
85 }
86
87 protected Set<SocketOption<?>> supportedOptions() {
88 HashSet<SocketOption<?>> options = new HashSet<>(super.supportedOptions());
89 options.addAll(filterSocketOption(extendedOptions.options()));
90 return options;
91 }
92
93 private Set<SocketOption<?>> filterSocketOption(Set<SocketOption<?>> options) {
94 Set<SocketOption<?>> opt = new HashSet<>(options);
95 final Iterator<SocketOption<?>> iterator = opt.iterator();
96 while (iterator.hasNext()) {
97 SocketOption<?> option = iterator.next();
98 // SO_QUICKACK is applicable for TCP Sockets only.
99 if (option.name().equals("SO_QUICKACK")) {
100 iterator.remove();
101 break;
102 }
103 }
104 return opt;
105 }
106
107 protected void socketSetOption(int opt, Object val) throws SocketException {
108 if (opt == SocketOptions.SO_REUSEPORT &&
109 !supportedOptions().contains(StandardSocketOptions.SO_REUSEPORT)) {
110 throw new UnsupportedOperationException("unsupported option");
111 }
112 try {
113 socketSetOption0(opt, val);
114 } catch (SocketException se) {
115 if (!connected)
116 throw se;
117 }
118 }
119
120 protected synchronized native void bind0(int lport, InetAddress laddr)
121 throws SocketException;
122
123 protected native void send(DatagramPacket p) throws IOException;
124
|