it-swarm.it

ConnectionTimeout vs SocketTimeout

Sto riscontrando un problema con una libreria che sto utilizzando. Potrebbe essere la libreria o potrebbe essere che io lo stia usando male!

Fondamentalmente, quando lo faccio (Timeout in millisecondi)

_ignitedHttp.setConnectionTimeout(1);  // v short
_ignitedHttp.setSocketTimeout(60000);  // 60 seconds

Non viene generata alcuna eccezione di timeout e funziona bene, tuttavia, quando faccio quanto segue,

_ignitedHttp.setConnectionTimeout(60000);  // 60 seconds
_ignitedHttp.setSocketTimeout(1);          // v short

Ottengo un'eccezione socket.

Quindi, la mia domanda è: perché non posso simulare un'eccezione di connessione? Sto fraintendendo la differenza tra un socket e un timeout della connessione? La libreria è qui (non ancora ufficialmente rilasciata).

116
Robert

Un timeout di connessione si verifica solo all'avvio della TCP. Questo di solito accade se la macchina remota non risponde. Ciò significa che il server è stato spento, hai usato il nome IP/DNS errato, la porta errata o la connessione di rete al server non sono attivi.

Un timeout socket è dedicato al monitoraggio del flusso di dati in entrata continuo. Se il flusso di dati viene interrotto per il timeout specificato, la connessione viene considerata bloccata/interrotta. Naturalmente questo funziona solo con connessioni in cui i dati vengono ricevuti continuamente.

Impostando il timeout del socket su 1, ciò richiederebbe la ricezione di ogni millisecondo di nuovi dati (supponendo che si legga il blocco dati in modo saggio e che il blocco sia sufficientemente grande)!

Se solo il flusso in entrata si blocca per più di un millisecondo, si verifica un timeout.

203
Robert

A timeout connessione è il tempo massimo che il programma è disposto ad attendere per impostare una connessione a un altro processo. A questo punto non stai ricevendo o pubblicando alcun dato sull'applicazione, stai solo stabilendo la connessione stessa.

A timeout socket è il timeout durante l'attesa di singoli pacchetti. È un'idea sbagliata comune che un timeout del socket sia il timeout per ricevere la risposta completa. Pertanto, se si dispone di un timeout del socket di 1 secondo e di una risposta composta da 3 pacchetti IP, in cui ogni pacchetto di risposta impiega 0,9 secondi per arrivare, per un tempo di risposta totale di 2,7 secondi, non si verificherà alcun timeout.

68
entpnerd