Browse Source

Moved ServerSocket creation from Listener to Factory
Set reuseAddr on ServerSocket before port is bound

Lars 10 years ago
parent
commit
7fd869eedc

+ 2 - 11
src/de/tudarmstadt/informatik/hostage/HoneyListener.java

@@ -9,9 +9,6 @@ import javax.net.ssl.SSLContext;
 import javax.net.ssl.SSLSocket;
 import javax.net.ssl.SSLSocketFactory;
 
-import android.content.Context;
-import android.content.SharedPreferences;
-import android.content.SharedPreferences.Editor;
 import de.tudarmstadt.informatik.hostage.net.MyServerSocketFactory;
 import de.tudarmstadt.informatik.hostage.protocol.Protocol;
 import de.tudarmstadt.informatik.hostage.protocol.SSLProtocol;
@@ -97,14 +94,8 @@ public class HoneyListener implements Runnable {
 	 */
 	public boolean start() {
 		try {
-			if(port < 1024){
-				if(!MainActivity.porthackInstalled)
-					return false;
-				server = new MyServerSocketFactory().createServerSocket(port);
-			} else{
-				server = new ServerSocket(port);
-				server.setReuseAddress(true);
-			}
+			server = new MyServerSocketFactory().createServerSocket(port);
+			if(server == null) return false;
 			(this.thread = new Thread(this)).start();
 			service.notifyUI(this.getClass().getName(), protocol.toString() + MainActivity.LISTENER);
 			running = true;

+ 21 - 11
src/de/tudarmstadt/informatik/hostage/net/MyServerSocketFactory.java

@@ -4,12 +4,14 @@ import java.io.FileDescriptor;
 import java.io.IOException;
 import java.lang.reflect.Field;
 import java.net.InetAddress;
+import java.net.InetSocketAddress;
 import java.net.ServerSocket;
 import java.net.SocketImpl;
 
 import javax.net.ServerSocketFactory;
 
 import de.tudarmstadt.informatik.hostage.system.PrivilegedPort;
+import de.tudarmstadt.informatik.hostage.ui.MainActivity;
 
 /**
  * Server Socket Factory using the porthack.
@@ -23,18 +25,26 @@ public class MyServerSocketFactory extends ServerSocketFactory {
 	 */
 	@Override
 	public ServerSocket createServerSocket(int port) throws IOException {
-		FileDescriptor fd = new PrivilegedPort(port).bindAndGetFD();
-		ServerSocket socket = new ServerSocket();
-		
-		try {
-			SocketImpl impl = getImpl(socket);
-			injectFD(fd, impl);
-			injectImpl(impl, socket);
-			setBound(socket);
-		} catch (Exception e) {
-			e.printStackTrace();
+		ServerSocket socket = null;
+		if(port > 1023){
+			socket = new ServerSocket();
+			// Set SO_REUSEADDRESS before port is bound
+			socket.setReuseAddress(true);
+			socket.bind(new InetSocketAddress(port));
+		} else if(MainActivity.porthackInstalled){
+			FileDescriptor fd = new PrivilegedPort(port).bindAndGetFD();			
+			socket = new ServerSocket();
+			
+			try {
+				SocketImpl impl = getImpl(socket);
+				injectFD(fd, impl);
+				injectImpl(impl, socket);
+				setBound(socket);
+			} catch (Exception e) {
+				e.printStackTrace();
+			}
 		}
-
+		
 		return socket;
 	}