|
@@ -0,0 +1,64 @@
|
|
|
+package de.tudarmstadt.informatik.hostage.net;
|
|
|
+
|
|
|
+import java.io.FileDescriptor;
|
|
|
+import java.io.IOException;
|
|
|
+import java.lang.reflect.Field;
|
|
|
+import java.net.DatagramSocket;
|
|
|
+import java.net.DatagramSocketImpl;
|
|
|
+import java.net.InetSocketAddress;
|
|
|
+
|
|
|
+import de.tudarmstadt.informatik.hostage.system.Device;
|
|
|
+import de.tudarmstadt.informatik.hostage.system.PrivilegedPort;
|
|
|
+import de.tudarmstadt.informatik.hostage.system.PrivilegedPort.TYPE;
|
|
|
+
|
|
|
+public class MyDatagramSocketFactory {
|
|
|
+
|
|
|
+ public DatagramSocket createDatagramSocket(int port) throws IOException {
|
|
|
+ DatagramSocket socket = null;
|
|
|
+ if (port > 1023) {
|
|
|
+ socket = new DatagramSocket();
|
|
|
+ socket.setReuseAddress(true);
|
|
|
+ socket.bind(new InetSocketAddress(port));
|
|
|
+ } else if (Device.isPPInstalled()) {
|
|
|
+ FileDescriptor fd = new PrivilegedPort(TYPE.UDP, port).getFD();
|
|
|
+ socket = new DatagramSocket();
|
|
|
+ try {
|
|
|
+ DatagramSocketImpl impl = getImpl(socket);
|
|
|
+ injectFD(fd, impl);
|
|
|
+ injectImpl(impl, socket);
|
|
|
+ setBound(socket);
|
|
|
+ } catch (NoSuchFieldException e) {
|
|
|
+ } catch (IllegalAccessException e) {
|
|
|
+ } catch (IllegalArgumentException e) {
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return socket;
|
|
|
+ }
|
|
|
+
|
|
|
+ private DatagramSocketImpl getImpl(DatagramSocket socket) throws NoSuchFieldException, IllegalAccessException, IllegalArgumentException {
|
|
|
+ Field implField = socket.getClass().getDeclaredField("impl");
|
|
|
+ implField.setAccessible(true);
|
|
|
+ return (DatagramSocketImpl) implField.get(socket);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void injectFD(FileDescriptor fd, DatagramSocketImpl impl) throws NoSuchFieldException, IllegalAccessException, IllegalArgumentException {
|
|
|
+ Class<?> plainDatagramSocketImplClazz = impl.getClass();
|
|
|
+ Class<?> datagramSocketImplClazz = plainDatagramSocketImplClazz.getSuperclass();
|
|
|
+ Field fdField = datagramSocketImplClazz.getDeclaredField("fd");
|
|
|
+ fdField.setAccessible(true);
|
|
|
+ fdField.set(impl, fd);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void injectImpl(DatagramSocketImpl impl, DatagramSocket socket) throws NoSuchFieldException, IllegalAccessException, IllegalArgumentException {
|
|
|
+ Field implField = socket.getClass().getDeclaredField("impl");
|
|
|
+ implField.setAccessible(true);
|
|
|
+ implField.set(socket, impl);
|
|
|
+ }
|
|
|
+
|
|
|
+ private void setBound(DatagramSocket socket) throws NoSuchFieldException, IllegalAccessException, IllegalArgumentException {
|
|
|
+ Field boundField = socket.getClass().getDeclaredField("isBound");
|
|
|
+ boundField.setAccessible(true);
|
|
|
+ boundField.set(socket, true);
|
|
|
+ }
|
|
|
+
|
|
|
+}
|