2012-04-09 11 views
6

W mojej aplikacji Hyave stworzyłem gniazdo datagarm i zwiąłem port powiedzmy 9999 do ip 192.168.173.1 teraz chcę powiązać port z nowym ip powiedzieć 192.168.173.2 ale nie jestem w stanie zrobić to etapach i następniePonowne wiązanie portu do gniazda datagramowego na innym IP

1 DatagramSocket s= new DatagramSocket(port,ip1); 
2 s.disconnect(); 

s.close(); 

s= new DatagramSocket(port,ip2); 

ale to daje

java,net,BindException :Address already in use : Cannot bind 

Każdy wgląd byłoby bardzo pomocne.

+0

Czy można sprawdzić następujące: 1. Port 9999 jest bezpłatny IP2, 2. IP2 jest pingable 3. masz uprawnień dostępu do IP2. – NiranjanBhat

Odpowiedz

7

Aby uniknąć wyjątków podczas próby odwiązania i ponownego powiązania, należy ustawić każde utworzone gniazdo jako nadające się do ponownego użycia. Aby to zrobić, należy utworzyć niezwiązany Gniazdo:

DatagramSocket s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(someSocketAddress); 

Więcej informacji: http://docs.oracle.com/javase/7/docs/api/java/net/Socket.html#setReuseAddress(boolean)

PS: Limit czasu, który jest główną przyczyną wyjątku BindException w takich okolicznościach podczas korzystania z protokołu TCP, może nie dotyczyć gniazd UDP, ale SO_REUSE powinno umożliwić natychmiastowe ponowne powiązanie. http://docs.oracle.com/javase/7/docs/api/java/net/DatagramSocket.html#setReuseAddress(boolean)

Oto kilka przykładów:

final int port = 55880; 

a) Nie ponownego użycia, nie blisko = adres już w użytku

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 

s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("localhost", port)); 

B) ponownego wykorzystania, bez bliskich = żadnych skarg

DatagramSocket s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 

s = new DatagramSocket(null); 
s.setReuseAddress(true); 
s.bind(new InetSocketAddress("localhost", port)); 

C) nr ponowne blisko = bez dolegliwości (gniazdek datagramów o ylko)

DatagramSocket s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("127.0.0.1", port)); 
s.close(); 

s = new DatagramSocket(null); 
s.bind(new InetSocketAddress("localhost", port)); 
s.close(); 
+0

Nie działało, ustawiłem ponowne użycie gniazda jako prawdziwe, ale ten sam wyjątek znów się kręci. – cornercoder

+0

Jeśli wszystkie gniazda, które łączą się z tym konkretnym portem, są przeznaczone do wielokrotnego użycia, nie można uzyskać wyjątku powiązania. – afk5min

+0

jest tylko jeden port i otrzymuję wyjątek – cornercoder

Powiązane problemy