Wie vermeide ich eine NoRouteToHostException?

Offenlegung: Der Code, an dem ich arbeite, ist für Studienleistungen gedacht.

Hintergrund: Die Aufgabe, die ich zu erledigen versuche, besteht darin, über die Auswirkungen verschiedener Einfädelungstechniken zu berichten. Dazu habe ich mehrere Klassen geschrieben, die auf eine Anfrage eines Clients mit Java Sockets antworten. Die Idee ist, den Server mit Anfragen zu überfluten und zu berichten, wie verschiedene Threading-Strategien damit umgehen. Jeder Client stellt 100 Anfragen und in jeder Iteration erhöhen wir die Anzahl der Clients um 50, bis etwas kaputt geht.

Problem: Wiederholt und konsequent tritt eine Ausnahme auf:

Caused by: java.net.NoRouteToHostException: Cannot assign requested address
    at java.net.PlainSocketImpl.socketConnect(Native Method)
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:333)

Dies tritt in verschiedenen Szenarien auf, z. B. wenn sowohl der Client als auch der Server auf localhost ausgeführt werden. Verbindungen können für eine Weile erfolgreich hergestellt werden. Kurz nach dem Versuch, 150 Clients zu verbinden, wird die Ausnahme ausgelöst.

Mein erster Gedanke war, dass es das Limit von Linux für Open File Descriptors (1024) sein könnte, aber ich glaube nicht. Ich habe auch überprüft, ob alle Verbindungen zwischen den Buchsen ordnungsgemäß geschlossen sind (d. H. Innerhalb eines korrekten Bereichs)finally Block).

Ich zögere, den Code zu veröffentlichen, da ich nicht sicher bin, welche Teile am relevantesten sind, und keine große Auflistung von Code in der Frage haben möchte.

Ist das schon mal jemandem begegnet? Wie kann ich die NoRouteToHostException vermeiden?

EDIT (weitere Fragen sind kursiv gedruckt)

Einige gute Antworten, die entweder auf The Ephemeral Port Range oder RFC 2780 verweisen. Beide weisen darauf hin, dass zu viele Verbindungen offen sind. Bei beiden scheint die Anzahl der Verbindungen, die hergestellt werden müssen, um dieses Limit zu erreichen, darauf hinzudeuten, dass ich irgendwann keine Verbindungen mehr schließe.

Nach dem Debuggen von Client und Server wurde festgestellt, dass beide den Methodenaufruf getroffen habenmyJava-Net-SocketInstance.close(). Dies würde darauf hindeuten, dass Verbindungen geschlossen werden (zumindest im nicht außergewöhnlichen Fall).Ist das ein richtiger Vorschlag?

Ebenfalls,Muss auf Betriebssystemebene gewartet werden, bis die Ports wieder verfügbar sind? Es wäre eine Möglichkeit, das Programm für mehr als 50 Clients separat auszuführen, wenn es nur eine kurze Zeit (oder optimistisch einen Befehl ausführen würde) benötigt, bevor der nächste Versuch ausgeführt wird.

EDIT v2.0

Nachdem ich die guten Antworten gelesen hatte, änderte ich meinen Code, um die Methode setReuseAddress (true) für jede auf dem Client hergestellte Socket-Verbindung zu verwenden. Dies hatte nicht den gewünschten Effekt und ich bin immer noch auf 250-300 Kunden beschränkt. Nachdem das Programm beendet wurde, führen Sie den Befehl ausnetstat -a zeigt, dass es im TIME_WAIT-Status viele Socket-Verbindungen gibt.

Meine Vermutung war, dass wenn eine Steckdose in der warTIME-WAIT Status und war mit dem gesetzt wordenSO-REUSEADDR Option, alle neuen Sockets, die versuchen, diesen Port zu verwenden, sind in der Lage - ich erhalte jedoch weiterhin die NoRouteToHostException.

Ist das richtig? Gibt es noch etwas, das getan werden kann, um dieses Problem zu lösen?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage