Verbindungs reconnect Address already in use

Empire Phoenix

Top Contributor
Warum geht folgender code nicht? (Ist nur ein Beispiel so benutze ich das natürlich nicht)
Erster start Eine runde lauft erfolgreich dannach gibt es sofort ne:Exception in thread "main" java.net.BindException: Address already in use: connect
diese tritt interessanter weise bei der connect auf und nicht bei der bind.

Solange jetzt laut netstat -a diese verbindung noch auf TIME_WAIT steht lässt sich keine weitere Runde beenden.
Hat einer eine Ahnung woher dieses Verhalten kommt?

Java:
import java.net.InetSocketAddress;
import java.net.Socket;


public class TestSocketReuse {
	static private InetSocketAddress local = new InetSocketAddress("0.0.0.0", 21);
	static private InetSocketAddress remote = new InetSocketAddress("nh-game.net", 80);
	
	public static void main(String[] args) throws Exception{
		while(true){
			
			Socket socket = new Socket();
			socket.setReuseAddress(true); 
			socket.bind(local);
			socket.connect(remote);  //why does this line throws the bind exeption?
			socket.close();
			System.out.println("Round succesfull");
		}
	}

}
 

HoaX

Top Contributor
Weil der Port verständlicher weise noch belegt ist. Man kann keine zwei Sockets auf den selben Port binden. Warum überhautp nochmal einen neuen Socket in der Schleife erstellen? Mach das einfach einmal vor der Schleife und gut is.
 

Empire Phoenix

Top Contributor
nur die kurze frage, ihr habt schon das socket.setReuseAddress(true); gesehen oder? weil laut der javadok davon soll einem das genau das sofortige rebinden nach dem close ermöglichen......
.....

Und wie ich schon sagte geht es dabei nur um ein Beispiel, als simples Testcase. Die reale logic ist erheblich kompizierter.

Das Programm spingt in wirklicheit zwschen mehreren hundert servern hin und her, und wenn die situation auftritt, dass es auf dem server wo es gerade zuvor war zurückspringt passiert der fehler.
 

Empire Phoenix

Top Contributor
Win xp x86 und Win 7 x64

Code:
Exception in thread "main" java.net.BindException: Address already in use: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	at java.net.PlainSocketImpl.connect(Unknown Source)
	at java.net.SocksSocketImpl.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at java.net.Socket.connect(Unknown Source)
	at TestSocketReuse.main(TestSocketReuse.java:15)
 

Ähnliche Java Themen


Oben