No se trata de cómo hacerlo, sino de si está mal lo que estoy haciendo. He leído que no es posible detectar si un socket se cierra inesperadamente (como matar el proceso servidor/cliente, desconectando el cable de red) mientras se esperan los datos (BeginReceive), sin el uso de temporizadores o mensajes enviados regularmente, etc. durante bastante tiempo he estado usando la siguiente configuración para hacer esto, y hasta ahora siempre ha funcionado perfectamente.Detección de desconexión de socket inesperada
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
}
}
Ahora, ya lo he leído no es posible sin más, me pregunto si hay algo mal con mi método. ¿Esta ahí? ¿O hay una diferencia entre matar procesos y tirar cables y similares?
+1 en particular porque me gusta cómo pones "si está programado para hacerlo". –
+1 También me gustaría señalar que nunca se debe tener una declaración catch que capte todo a menos que se vuelva a lanzar. –
@Alex No estoy de acuerdo con la prohibición de detectar todas las excepciones a menos que las vuelvas a lanzar. Tengo una clase de servidor TCP, que funciona muy parecido a la de aquí y no quiero una excepción aleatoria para terminar toda la aplicación de servidor. Es por eso que atrapo todas las excepciones y las paso a un manejador de eventos OnExceptionCaught, que debe estar conectado a alguna funcionalidad de registro, etc. – Algoman