2008-09-22 16 views
10

W języku Java można podać liczbę zero jako pojedynczy parametr dla konstruktora Socket lub DatagramSocket. Java przypisuje to gniazdo do wolnego portu. Czy można ograniczyć wyszukiwanie portu do określonego zakresu?Jak określić zakres portów dla gniazd Java?

+0

Cóż, dla nieuprzywilejowanych użytkowników jest już ograniczona do> 1024 na * nix: P – freespace

+0

Niestety jesteśmy w systemie Windows;) –

Odpowiedz

7

Hm, po przeczytaniu dokumentów, nie sądzę, że możesz. Możesz połączyć się z dowolnym portem, a następnie ponownie powiązać, jeśli nie jest akceptowalny, lub wielokrotnie wiązać port w swoim zasięgu, aż do osiągnięcia sukcesu. Druga metoda będzie najbardziej "skuteczna".

Jestem niespokojny o tej odpowiedzi, ponieważ jest ... nieeleganckie, ale ja naprawdę nie mogę znaleźć nic innego, albo:/

+2

Należy również pamiętać, że Czasami wpływ na bezpieczeństwo ma wyszukiwanie liniowe wolnego portu. Jeśli korzystasz z portu A dla klienta 1 i portu A + 1 dla następnego klienta, klient 1 może odgadnąć port, którego zamierzasz użyć dla innego klienta. – Darron

2

Oprawa gniazdo do wolnego portu jest (zazwyczaj) cechą obsługa gniazd systemu operacyjnego; to nie jest specyficzne dla java. Na przykład Solaris obsługuje dostosowanie efemerycznego zakresu portów za pomocą polecenia ndd. Ale tylko root może dostosować zasięg i wpływa na cały system, a nie tylko na twój program.

Jeśli zwykłe efemeryczne zachowanie wiązania nie odpowiada Twoim potrzebom, prawdopodobnie będziesz musiał napisać własną przy użyciu Socket.bind().

0

Możesz rzucić okiem na kod Java, który implementuje funkcję, której używasz. Większość bibliotek java jest napisanych w Javie, więc możesz po prostu zobaczyć, co tam jest potrzebne.

Zakładając, że @Kenster miał rację i jest to operacja systemowa, być może będziesz musiał po prostu powtórzyć testowanie portów, próbując połączyć się z każdym z nich. Chociaż jest to trochę bolesne, nie powinno to być więcej niż kilka linii kodu.

1

Oto kod trzeba:

public static Socket getListeningSocket() { 
    for (int port = MIN_PORT ; port <= MAX_PORT ; port++) 
    { 
     try { 
      ServerSocket s = new ServerSocket(port); 
      return s;  // no exception means port was available 
     } catch (IOException e) { 
      // try the next port 
     } 
    } 
    return null; // port not found, perhaps throw exception? 
} 
+3

Powinieneś raczej złapać numer BindException, który jest uruchamiany, gdy port jest już w użyciu. – Chochos