# Problem mit 2 Serversockets unter Win XP



## SleepProgger (10. Sep 2010)

Hallo, ich bastele momentan an einem Server der auch passive Übertragung (ähnlich ftp) unterstützt.
Dabei bin ich auf folgendes Problem gestoßen:
Ich habe zwei ServerSockets die jeweils in einem eigenen Thread laufen.
Nun scheinen die accept()-Methoden der beiden sich gegenseitig zu blockieren.
Wenn ich mich 3 mal hintereinander zu dem ersten ServerSocket connecte, wird die Verbindung beim ersten mal angenommen, bzw. die Testdaten werden geschickt, die nächsten beiden male nicht.
Damit das ganze funktioniert muss ich mich immer abwechselnd zu beiden Sockets verbinden.

Unter Ubuntu funktioniert das ganze wunderbar.
Mein System: Win Xp Pro SP2
Ausserdem habe ich Antivir und die Ashampoo Firewall laufen, falls das vielleicht Probleme macht.

Weiß vielleicht jemand wie ich das ganze auf Windows zum laufen bringe?

*Hier mal Testcode:*

```
import java.io.IOException;
import java.net.ServerSocket;
import java.net.Socket;


public class ServerThread extends Thread {
	private ServerSocket serverSocket;
	public ServerThread(int port) {
		try {
			serverSocket = new ServerSocket(port);
			start();
		} catch (IOException e) {
			e.printStackTrace();
		}
	}
	
	@Override
	public void run() {
		super.run();
		Socket tmpCientSocket;
		int connectionCount = 0;
		
		try {
			while (!interrupted()){
				System.out.println("Before Sock with port:"+serverSocket.getLocalPort()+" accept #"+connectionCount);
				tmpCientSocket = serverSocket.accept();
				tmpCientSocket.getOutputStream().write("hello".getBytes());
				System.out.println("After Sock with port:"+serverSocket.getLocalPort()+" accept #"+connectionCount);
				connectionCount++;
			}
		} catch (IOException e) {
			e.printStackTrace();
		}finally{
			//TODO close clientSocks
			try {
				serverSocket.close();
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
	
	public static void main(String[] args) {
		new ServerThread(9966);
		new ServerThread(9977);
	}
}
```


----------



## tuxedo (10. Sep 2010)

Wenn mit Ubuntu fehlerfrei läuft, probiers doch einfach mal ohne Ashampoo Firewall... Frei nach dem "Ausschlussverfahren".

Ach ja: Manche Firewall muss man sogar deinstallieren damit sie wirklich deaktiviert sind.

- Alex


----------



## SleepProgger (10. Sep 2010)

Ein einfaches Deaktivieren hat in meinem Fall auch nichts gebracht.
Deinstallieren möchte ich das Ding eigentlich nicht.
Allerdings drängt sich der Verdacht auf das es wirklich an eben jener Firewall liegt. (Networking - Weird ServerSocket.accept() behaviour on Windows)


Könnte vlt. jemand ohne, oder mit einer anderen Desktop-Firewall, das ganze mal probieren und mir das Ergebnis senden.
Vielen Dank.


----------



## tuxedo (10. Sep 2010)

?? Stöpsel die DSL-Leitung raus und probierts mit deinstallierter Firewall im lokalen Netz. Wirst ja nicht ein dermaßen unsicheres LAN haben dass du nicht mal 10min ohne Firewall auskommst?!

- Alex


----------



## SleepProgger (10. Sep 2010)

Meinen Rechner neu zu starten ist so eine Sache 
Ich ziehe mir flugs vmWare und berichte dann.

edit: :lol: Zur Installation Für vmWare muss ich ja auch neu starten.


----------



## SleepProgger (10. Sep 2010)

So, ich habe es endlich geschafft , und schlussendlich in einer virtualBox getestet.
Testergebnisse:
ohne av und ohne firewall --> Ok
mit av und ohne firewall --> Ok
mit av und mit firewall --> Fehler
ohne av und mit firewall --> Fehler

Das Problem ist so wie es scheint wirklich die Firewall.
Ah.. ich sehe auch endlich den Sinn darin, falls die Firewall zwei Verbindungen aus einem Prozess zulassen würde könnte man ja problemlos seinen Server an eine exe hängen die Zugriffsrechte hat.
Die Frage aller Fragen ist nun: Wie umgehe ich das ganze ?


Dabei fällt mir auch gerade ein das ich dann scheins im falschen Forum bin, da dieses Verhalten dann Programmiersprachen unabhängig seien sollte. 

*edit:*
Vielleicht hat ja doch jemand hier eine Idee.
Die einzigen Möglichkeiten, außer die Firewall zu deinstallieren, die mir einfallen sind:
- Der CommandSocket erzeugt den DataSocket in einen neuen Prozess.
- Man verwendet nur einen Port und jeder Client gibt am Anfang an ob dies ein Data- oder ein CommandSocket ist.

Beide Varianten gefallen mir nicht  wirklich, allerdings sehe ich bei der zweiten Variante bis auf den Programmieraufwand keinen Nachteil gegenüber der Lösung mit den zwei lauschenden Sockets.


----------



## Empire Phoenix (11. Sep 2010)

Ausnahme inner Firewall einrichten? Und in einer Readme die Ports angeben die benötigt werden für andere falls es nciht nur für prrivatgebrach ist.


----------



## SleepProgger (11. Sep 2010)

Es geht nicht um das "normale" Verhalten dieser Desktop-Firewall (Sprich Nachfragen ob die Verbindung erlaubt werden soll oder nicht.)
Ich nehme an das die Firewall mit Hooks arbeitet und dieses Verhalten so irgendwie (geplant oder ungeplant) ausgelöst wird.

Ich werde das ganze demnächst mal unter c probieren.
Wenn meine Vermutung zutrifft müsste ich das selbe Problem auch dort haben, wobei es unter Java ja auch mit UnterProzessen funktioniert ? ???:L


----------

