Questa non è una domanda su come eseguire questa operazione, ma una domanda sul fatto che sia sbagliato ciò che sto facendo. Ho letto che non è possibile rilevare se un socket viene chiuso in modo imprevisto (come uccidere il processo server/client, tirare il cavo di rete) mentre si aspettano i dati (BeginReceive), senza l'uso di timer o messaggi inviati regolarmente, ecc. per un po 'di tempo ho usato il seguente setup per fare questo, e finora ha sempre funzionato perfettamente.Rilevamento disconnessione socket inatteso
public void OnReceive(IAsyncResult result)
{
try
{
var bytesReceived = this.Socket.EndReceive(result);
if (bytesReceived <= 0)
{
// normal disconnect
return;
}
// ...
this.Socket.BeginReceive...;
}
catch // SocketException
{
// abnormal disconnect
}
}
Ora, da quando ho letto che non è facilmente possibile, mi chiedo se c'è qualcosa di sbagliato con il mio metodo. È lì? O c'è una differenza tra i processi di uccisione e tirare i cavi e simili?
+1 in particolare perché mi piace come si inserisce "se è programmato per farlo". –
+1 Vorrei anche sottolineare che non si dovrebbe mai avere una dichiarazione di cattura che cattura tutto a meno che non la rilanci. –
@Alex Non sono d'accordo con il divieto di intercettare tutte le eccezioni a meno che non li si rilanci. Ho una classe TCP-server, che funziona molto come quella qui e non voglio alcuna eccezione casuale per terminare l'intera applicazione server. Ecco perché raccolgo tutte le eccezioni e le passo ad un gestore di eventi OnExceptionCaught, che dovrebbe essere collegato ad alcune funzionalità di registrazione ecc. – Algoman