Domanda

Quando si crea un socket in Java:

new Socket(host, port);

Il costruttore Socket proverà a connettersi a host: port prima di tornare. Su Windows, ciò 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 che se ho il controllo sulla creazione dei socket, posso fare:

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

ma preferirei che il sistema operativo utilizzasse un valore predefinito ragionevole. C'è un modo per cambiare questa impostazione su Linux?

Grazie

È stato utile?

Soluzione

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

Nota che sono a livello di sistema.

Altri suggerimenti

Vorrei sconsigliare di modificare le impostazioni del sistema operativo poiché potrebbe influire in modo imprevisto su altre applicazioni. Anche il metodo Socket.setSoTimeout() potrebbe aiutarti.

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

Se un tentativo di connessione su Windows fallisce immediatamente, è probabile che sia stato RST più potente da un router o che il vicino sia stato riconosciuto come non raggiungibile a livello di ARP. Prova il comando arp -a -v su Windows per visualizzare gli host non raggiungibili, che vengono rifiutati rapidamente.

Per Linux useresti ip neigh per elencare lo stato di raggiungibilità delle stazioni sulla tua rete locale.

Comprendo che ciò dipende dal timeout predefinito TCP / IP del sistema (240 secondi per impostazione predefinita?) ... un'opzione è provare a modificarli, tuttavia ciò potrebbe influire su tutti gli altri programmi sullo stesso computer che si basano sul valore di timeout. In tal caso, potrebbe essere più sicuro abbassare semplicemente & Quot; timeout & Quot; valore nella chiamata Java connect (), invece.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top