Sto lavorando su una relazione client/server che intende trasmettere i dati avanti e indietro per un periodo di tempo indeterminato.Come rilevare una disconnessione Disconnetti in C#
Il problema che sto tentando di superare è sul lato client, poiché non riesco a trovare un modo per rilevare una disconnessione.
Ho preso un paio di passaggi alle soluzioni di altre persone, che vanno dalla cattura di eccezioni IO, al polling del socket su tutti e tre i SelectModes. Ho anche provato a utilizzare una combinazione di un sondaggio, con un controllo sul campo "Disponibile" del socket.
// Something like this
Boolean IsConnected()
{
try
{
bool part1 = this.Connection.Client.Poll(1000, SelectMode.SelectRead);
bool part2 = (this.Connection.Client.Available == 0);
if (part1 & part2)
{
// Never Occurs
//connection is closed
return false;
}
return true;
}
catch(IOException e)
{
// Never Occurs Either
}
}
Sul lato server, un tentativo di scrivere un carattere 'vuoto' (\ 0) al client costringe un'eccezione IO e il server in grado di rilevare che il client si è disconnesso (abbastanza facile concerto).
Sul lato client, la stessa operazione non fa eccezione.
// Something like this
Boolean IsConnected()
{
try
{
this.WriteHandle.WriteLine("\0");
this.WriteHandle.Flush();
return true;
}
catch(IOException e)
{
// Never occurs
this.OnClosed("Yo socket sux");
return false;
}
}
Un problema che credo sto avendo nel rilevare una disconnessione tramite un sondaggio, è che posso abbastanza facilmente incontrare un falso su una SelectRead, se il mio server non ha scritto ancora nulla di nuovo al cliente dal l'ultimo controllo ... Non so cosa fare qui, ho inseguito ogni opzione per fare questo rilevamento che posso trovare e niente è stato al 100% per me, e in definitiva il mio obiettivo qui è quello di rilevare un server (o una connessione) fallimento, informare il cliente, aspettare di riconnettersi, ecc. Quindi sono sicuro che potete immaginare che questo è un pezzo integrale.
Apprezzare i suggerimenti di nessuno. Grazie in anticipo.
MODIFICA: Chiunque visualizzi questa domanda dovrebbe annotare la risposta seguente e i miei commenti finali su di esso. Ho spiegato come ho risolto questo problema, ma non ho ancora creato un post in stile "Q &".
È sufficiente rilevare le eccezioni IOException e utilizzare un timeout di lettura. Non hai bisogno di tutto questo altro malarkey. – EJP
L'ho già provato (nel caso non avessi letto il mio post ...) ed è un problema. Un'operazione di lettura che termina dopo un secondo causa un IO, che costringerebbe a disconnettere ... Ma cosa succede se non ho ricevuto dati ...? – DigitalJedi805
Ho letto il tuo post. Non è "incostante", è soggetto a buffer di dati asincroni sia localmente che da remoto. Non si otterrà un'eccezione sulla prima scrittura su una connessione fallita, poiché non è stata ancora rilevata: la si otterrà in una scrittura successiva, dopo che TCP ha interrotto i tentativi. – EJP