Domanda

Ho un'applicazione C # che funziona da diversi anni. Si collega tramite un socket TCP / IP a una macchina che mi invia esecuzioni di borsa.

Di recente, ho provato a distribuirlo su alcune macchine in un nuovo data center dietro un firewall hardware e ho iniziato a vedere alcune strane disconnessioni.

Quando si verifica una disconnessione, nella mia app (lato client), non vedo nulla di insolito tranne che smetto di ricevere dati tramite il socket. Wireshark conferma che nessun dato sta raggiungendo il socket e che il thread di ricezione della mia applicazione si blocca sulla chiamata Ricevi () quando lo interrompo nel debugger. Il socket mostra STABILITO in netstat.

Ma dal lato server sembra che il mio client non si stia connettendo. Guardando i loro registri, sembra che il socket alla loro estremità di solito finisca con (nRecvd = -1, errno = 104) o (nRecvd = 0, errno = 11). (104 è la connessione reimpostata dal peer).

La disconnessione sembra avvenire solo dopo un periodo di inattività. Per ora l'ho risolto implementando un battito cardiaco tra il mio client e il loro server che invia un breve messaggio ogni 20 secondi e riceve una risposta. Ciò ha causato la disconnessione a 0 a zero negli ultimi giorni.

Inizialmente, ho pensato che il problema fosse il firewall hardware. Stava causando il timeout del socket dopo l'attività. Ma il responsabile del firewall afferma che il timeout per la connessione su questa porta (8887) è di 2160 minuti.

Sto eseguendo Windows Server 2003 e .NET 3.5. Il server commerciale è una macchina linux (credo sles9 anche se non ne sono sicuro).

Qualche idea su cosa potrebbe succedere? Cosa potrei fare per eseguire il debug di più dato che non ho accesso ai log del firewall e nessuna possibilità di modificare il codice sul server commerciale?

Grazie, Mike

È stato utile?

Soluzione

Ciò che descrivi è comune ed è comune implementare un battito cardiaco per mantenere in vita i socket TCP attraverso tali firewall / gateway come hai fatto tu.

Quell'hardware potrebbe avere duri timeout di 2160 minuti (nella mia esperienza 20-30 minuti è più comune però), ma le connessioni vengono generalmente interrotte in modo molto più aggressivo se c'è qualche tipo di carico. Tali firewall dispongono di risorse limitate e quando necessitano di un maggiore tracciamento della connessione, tendono a eliminare la connessione meno recente tracciata senza alcuna attività, indipendentemente dal set di timeout difficile.

Se vuoi eseguire il debug di questo, vai sul lato server del firewall e vedi cosa succede, se succede, quando il server ottiene una disconnessione

Altri suggerimenti

Vorrei installare WireSharp su entrambi i lati del firewall per vedere cosa succede su TCP (e livello inferiore). E quando l'amministratore dice il "timeout per le connessioni" è qualcosa. È il timeout per una connessione inattiva, stabilita? Qualsiasi altra cosa non ha alcun senso immagino.

Inoltre, stai usando l'opzione KeepAlive per TCP? E questo viene inoltrato dal firewall o no?

Come ho detto, probabilmente voglio eseguire WireShark su entrambi i lati del firewall ...

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