2009-06-25 9 views
8

, wenn ein Socket in Java erstellen:Wie kann Socket-Verbindungstimeout unter Linux angezeigt/geändert werden?

new Socket(host, port); 

Der Socket-Konstruktor wird versuchen, Host zu verbinden: port vor der Rückkehr. Unter Windows schlägt dies fast sofort bei nicht erreichbaren Hosts fehl, aber bei Linux kann es bis zu 5 Minuten dauern, bis der Socket abgelaufen ist.

Ich bin mir bewusst, dass, wenn ich die Kontrolle haben über die Sockets zu schaffen, was ich tun kann:

Socket s = new Socket(); 
s.bind(..); 
s.connect(.., timeout); 

aber ich möchte lieber das Betriebssystem einen vernünftigen Standardwert verwenden. Gibt es eine Möglichkeit, diese Einstellung unter Linux zu ändern?

Dank

+0

Ich denke, es ist besser, dieses Timeout für jede Anwendung zu konfigurieren. Andernfalls sind alle anderen Anwendungen, die auf diesem System ausgeführt werden, von dieser Einstellung betroffen. – Reginaldo

+1

Einverstanden, ich möchte immer noch wissen, was die Einstellung ist, sollte ich es ändern wollen. – Kevin

+1

Wenn Sie darauf bestehen, die OS-Einstellungen zu ändern, dann denke ich, dass dies keine Programmierfrage mehr ist und zu Server Fault gehört. – akarnokd

Antwort

7

Ich denke, Sie wollen /proc/sys/net/ipv4/tcp_syn_retries. Der Standardwert ist normalerweise 5 oder 6, was ungefähr 3 Minuten beträgt.

Beachten Sie, dass diese systemweit sind.

+0

Wie wird die Zeit zwischen den Wiederholungen festgelegt? Es scheint mit jeder Wiederholung exponentiell zuzunehmen. Wo ist das Set? – Kevin

+0

Die Intervalle erhöhen sich mindestens bis zu einem Punkt. Meine Erinnerung versagt mich hier. Ich erinnere mich nicht, ob das BSD-Sache oder TCP ist und ich bin mir nicht sicher, ob Linux Ihnen einen Weg gibt, es zu kontrollieren. – Duck

+4

Die Intervalle werden durch die Werte rtoMin, rtoMax und rtoInitial gesteuert, wobei rto für Round Trip Timeout steht. Im Grunde bedeutet es die Zeit, die ein Paket für eine Rundreise benötigt. Wenn also TCP die erste Nachricht sendet, würde es auf rtoInitial time warten. Wenn es keine Antwort erhält, verdoppelt es den rto (und fügt einen gewissen Jitter-Wert hinzu) und versucht es erneut. Dies wird bis zu maxRetries fortgesetzt. Der aktuelle Rto-Wert wird niemals über RtoMax hinausgehen. –

0

Es ist mein Verständnis, dass dies auf der TCP/IP-Standard-Timeout (240 Sekunden standardmäßig?) ... ist eine Option, um zu versuchen, das System hängt jedoch diejenigen Tweaking diese auf die andere Programme beeinflussen könnten gleiche Maschine, die sich auf den Timeout-Wert verlassen. In diesem Fall ist es möglicherweise sicherer, stattdessen den Wert für die Zeitüberschreitung in Ihrem Java Connect() - Aufruf zu verringern.

4

Ich würde davon abraten, die Betriebssystemeinstellungen zu ändern, da dies möglicherweise andere Anwendungen unerwartet beeinträchtigen könnte. Die Socket.setSoTimeout() Methode könnte Ihnen auch helfen.

+2

Darf ich den Grund fragen für den Downvote, damit ich daraus lernen könnte? – akarnokd

+2

Ich denke, SO_TIMEOUT gilt zu lesen, aber nicht verbinden, also könnte das der Grund sein. Ich kann jedoch im Moment keine Bestätigung dafür finden. –

2

Es ist übrigens nicht ganz korrekt, dass sich Linux und Windows hier anders verhalten. Neben den anfänglichen SYN-Wiederholungen (die unter Linux und Windows konfiguriert werden können) spielen auch der Nachbarzustand sowie andere Router, die RST-Pakete senden, eine Rolle.

Wenn ein Verbindungsversuch unter Windows sofort fehlschlägt, ist es wahrscheinlich, dass er von einem Router RSTed oder von ARP als nicht erreichbar erkannt wurde. Versuchen Sie unter Windows den Befehl arp -a -v, um die nicht erreichbaren Hosts zu sehen, die schnell zurückgewiesen werden.

Für Linux würden Sie ip neigh verwenden, um den Erreichbarkeitsstatus von Stationen in Ihrem lokalen Netzwerk aufzulisten.

Verwandte Themen