MyServerSocketFactory.java 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. package de.tudarmstadt.informatik.hostage.net;
  2. import java.io.FileDescriptor;
  3. import java.io.IOException;
  4. import java.lang.reflect.Field;
  5. import java.net.InetAddress;
  6. import java.net.ServerSocket;
  7. import java.net.SocketImpl;
  8. import javax.net.ServerSocketFactory;
  9. import de.tudarmstadt.informatik.hostage.system.PrivilegedPort;
  10. public class MyServerSocketFactory extends ServerSocketFactory {
  11. @Override
  12. public ServerSocket createServerSocket(int port) throws IOException {
  13. FileDescriptor fd = new PrivilegedPort(port).bindAndGetFD();
  14. ServerSocket socket = new ServerSocket();
  15. try {
  16. SocketImpl impl = getImpl(socket);
  17. injectFD(fd, impl);
  18. injectImpl(impl, socket);
  19. setBound(socket);
  20. } catch (Exception e) {
  21. e.printStackTrace();
  22. }
  23. return socket;
  24. }
  25. private SocketImpl getImpl(ServerSocket socket) throws Exception {
  26. Field implField = socket.getClass().getDeclaredField("impl");
  27. implField.setAccessible(true);
  28. return (SocketImpl) implField.get(socket);
  29. }
  30. private void injectFD(FileDescriptor fd, SocketImpl impl) throws Exception {
  31. Class<?> plainServerSocketImplClazz = impl.getClass();
  32. Class<?> plainSocketImplClazz = plainServerSocketImplClazz
  33. .getSuperclass();
  34. Class<?> socketImplClazz = plainSocketImplClazz.getSuperclass();
  35. Field fdField = socketImplClazz.getDeclaredField("fd");
  36. fdField.setAccessible(true);
  37. fdField.set(impl, fd);
  38. }
  39. private void injectImpl(SocketImpl impl, ServerSocket socket)
  40. throws Exception {
  41. Field implField = socket.getClass().getDeclaredField("impl");
  42. implField.setAccessible(true);
  43. implField.set(socket, impl);
  44. }
  45. private void setBound(ServerSocket socket) throws Exception {
  46. Field boundField = socket.getClass().getDeclaredField("isBound");
  47. boundField.setAccessible(true);
  48. boundField.set(socket, true);
  49. }
  50. @Override
  51. public ServerSocket createServerSocket(int port, int backlog)
  52. throws IOException {
  53. return createServerSocket(port);
  54. }
  55. @Override
  56. public ServerSocket createServerSocket(int port, int backlog,
  57. InetAddress iAddress) throws IOException {
  58. return createServerSocket(port);
  59. }
  60. }