2009-06-25 25 views
8

Quando si crea un socket in Java:Come visualizzare/modificare il timeout della connessione socket su Linux?

new Socket(host, port); 

Il costruttore Socket cercherà di connettersi a host: porta prima di tornare. Su Windows, questo fallisce quasi immediatamente per gli host non raggiungibili, ma per Linux possono essere necessari fino a 5 minuti per il timeout di Socket.

Sono consapevole del fatto che se ho il controllo sulla creazione delle prese di corrente, non posso fare:

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

ma io preferisco avere il sistema operativo utilizza un valore predefinito ragionevole. C'è un modo per cambiare questa impostazione su Linux?

Grazie

+0

Penso che sia meglio configurare questo timeout in base a ciascuna applicazione. In caso contrario, tutte le altre applicazioni in esecuzione su questa macchina saranno interessate da questa impostazione. – Reginaldo

+1

D'accordo, mi piacerebbe ancora sapere quale sia l'impostazione se desidero cambiarla. – Kevin

+1

Se si desidera modificare le impostazioni del sistema operativo, penso che non si tratti più di una questione relativa alla programmazione e che si tratti di errore del server. – akarnokd

risposta

7

Penso che tu voglia /proc/sys/net/ipv4/tcp_syn_retries. Il valore predefinito è in genere 5 o 6, che viene visualizzato in circa 3 minuti.

Si noti che questi sono a livello di sistema.

+0

Come è il tempo tra ogni nuovo tentativo? Sembra aumentare in modo esponenziale con ogni tentativo. Dov'è questo set? – Kevin

+0

Gli intervalli aumentano, almeno fino a un certo punto. La mia memoria mi sta fallendo qui. Non ricordo se si tratta di cose BSD o TCP e non sono sicuro che Linux ti dia un modo per controllarlo. – Duck

+4

Gli intervalli sono controllati da valori denominati rtoMin, rtoMax e rtoInitial dove rto sta per Round Trip Timeout. Fondamentalmente, denota il tempo necessario per un pacchetto per fare un viaggio di andata e ritorno. Quindi, se quando TCP invia il primo msg, aspetterebbe il tempo rtoInitial. Se non riesce a ottenere una risposta, raddoppierà il rto (e aggiungerà qualche valore di jitter) e poi riproverà. Questo continuerà fino a maxRetries. L'attuale valore rto non passerà mai oltre rtoMax. –

0

E 'la mia comprensione che questo dipende dal timeout predefinito TCP/IP del sistema (240 secondi per default?) ... una possibilità è quella di provare tweaking quelli, ma questo potrebbe influenzare tutti gli altri programmi sul stessa macchina che si basa sul valore di timeout. In tal caso, potrebbe essere più sicuro semplicemente abbassare il valore di "timeout" nella chiamata Java connect(), invece.

4

Mi sconsiglio di modificare le impostazioni del sistema operativo in quanto potrebbe interessare in modo imprevisto altre applicazioni. Il metodo Socket.setSoTimeout() potrebbe aiutarti anche tu.

+2

Posso chiedere il motivo per il downvote quindi potrei imparare da esso? – akarnokd

+2

Penso che SO_TIMEOUT si applica alla lettura ma non alla connessione, quindi potrebbe essere il motivo. Non riesco a trovare la verifica di questo al momento però. –

2

Non è del tutto corretto, BTW e Windows si comportano in modo diverso. Oltre ai tentativi iniziali SYN (che possono essere configurati su Linux e Windows) anche lo stato vicino e altri router che inviano pacchetti RST hanno un ruolo.

Se un tentativo di connessione su Windows fallisce immediatamente, è probabile che sia stato riavviato Eighter da un router o che il neighbor sia stato riconosciuto come irraggiungibile a livello ARP. Prova il comando arp -a -v su Windows per vedere gli host non raggiungibili, che vengono respinti rapidamente.

Per Linux è necessario utilizzare ip neigh per elencare lo stato di raggiungibilità delle stazioni sulla rete locale.

Problemi correlati