Newsgroup: it.comp.lang.delphi
Titolo: TCP Client : Connection Reset By Peer

Buongiorno,
Sto litigando con i componentio TCP di Indy anche per fare cose molto
semplici.
Nel caso specifico sto usando TCP Client per collegarmi ad un server.
Per ragioni di debug ho inserito a video una checkbox che ha lo scopo
di mostrare quando la connessione fra client e server è presente e
visto che ho un timer che ogni N secondi scatta all'interno ho messo
il codice:
checkbox.checked := TCPClient.connected
Questa istruzione mi da errore continuamente nel caso in cui io faccia
cadere il link TCP scollegando il cavo di rete. Io non mi aspettavo
questo comportamento. Pensavo che nel caso in cui il link TCP cade il
TCPClient dovesse passare da Connected a Disconnected sollevando
l'evento disconnect.
Ed invece niente evento ed errore quando tento di accedere ai metodi
della classe : connected appunto ma anche (e qui potevo aspettarmelo)
quelli per la lettura / scrittura.
Quale è quindi il modo per gestire in maniera pulita la connessione?
Ho infarcito l'applicazione di Try except per ogni chiamata a metodi
di VCL TCP. Ma comunque in questo caso specifico ho che ogni N secondi
su un memo di log mi compare "Connection Reset By Peer"
Sono in difficoltà...
Luca

 Sono in difficoltà...
Posta il codice.

se stacchi il cavo mi rete la cosa non viene notificata al componente
e quindi non hai un evento del componente stesso per capire cosa e'
successo: solo al tentativo di utilizzare il socket  il componente si
accorge che qualcosa non va.
A.


E' questo il guaio che da quanto ne so i Socket non hanno funzioni per 
accorgesi della connessione o meno del cavo.
Dovrebbe a mio parere mettere la .connect all'interno di un Try..... 
Except.... On....Do ....End; e agire di conseguenza.
Giorgio


Sarebbe complicato. Perchè il problema l'ho posto in modo semplice
evidenziando la parte critica ma la realtà è un poco più complessa
perchè le connessioni TCP sono 3:  due client ed una da server.
In pratica "il gioco" è quello creare un SW che funzioni da ponte
frapponendosi fra due entità client/server progettate per parlarsi
direttamente.  Questo ponte si pone in mezzo con il compito di
prendere tutti i byte che arrivano da una parte passandoli all'altra e
viceversa in modo trasparente.La terza connessione è per la gestione
di eventi particolari (segnala errori, problemi, etc )
Quindi tutti i metodi relativi al TCP sono già sotto Try...except e la
gestione dell'errore prevede una segnalazione in un log, se sono in
debug mode, ed ovviamente qualche azione per risolvere il problema.
Il motivo per cui chiedo aiuto è che in questo caso non mi è chiaro
come risolvere!
Ricapitolando:
1) Eseguo la Connect
2) Periodicamente leggo / scrivo sul canale TCP
3) Scollego il cavo LAN
4) Mi accorgo del fail dalla Try.. Except delle operazioni di Read/
Write
5) Cosa faccio?
Dopo quel fail se eseguo TCPClient.Connected mi solleva un'eccezione
così come se tento una disconnect che non so se comunque porti ad un
qualche effetto
La gestivo erroneamente così
  if TcpEDR.Connected then
   Try
     TcpEDR.Disconnect;   // sono disconnesso lato server allora mi
disconnetto anche lato client
     If Debug Then mLog.Lines.Add( '[' + TimeToStr(Now) + ']
Disconnected From EDR' );
   Except on E:Exception do
     If Debug Then mLog.Lines.Add( '[' + TimeToStr(Now) + ']
OnEDRDisconnect : ' + E.Message + ' [ Host = ' + edrIP + ', Port = ' +
IntToStr(edrPort) + ' ]' );
   End;
non pensando che l'esecuzione fallita della connected non mi facesse
poi eseguire il resto.
qualche idea?
Grazie
Luca

Ciao a tutti,
Ho risolto semplicemente mettendo anche la TcpEDR.Conencted dentro un
try except e nel caso in cui mi da errore (ed accade) faccio eseguire
nella except il metodo Disconnect.
Questo a sua volta da errore ma comunque ottiene il risultato di
effettuare la disconnessione ed a quel punto nel resto del codice
tutto torna a funzionare.
Ho eseguito una decina di prove di disconnessione per esserne certo
Luca

 Ho eseguito una decina di prove di disconnessione per esserne certo
Ottimo.
ciao