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); } }