
25/03/2008, 09:31
|
| | Fecha de Ingreso: junio-2003 Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 21 años, 9 meses Puntos: 7 | |
Re: Saber si un Socket esta vivo C# Si, por supuesto (Asumo que conoces la programación asíncrona):
Código:
//Inicio mi Socket para aceptar conexiones.
objSocketServidor.BeginAccept(new AsyncCallback(ConexionRealizada), null);
//Metodo que captura la llamada Asincrona anterior y generera la ESCUCHA ASINCRONA
private void ConexionRealizada(IAsyncResult iAr)
{
try
{
Socket objSocket = objSocketServidor.EndAccept(iAr);
ClsSocket objCliente = new ClsSocket(objSocket);
listaSockets.Add(objCliente);
objSocketServidor.BeginAccept(new AsyncCallback(ConexionRealizada), null);
objSocket.BeginReceive(bytesDatos, 0, bytesDatos.Length, SocketFlags.None, new AsyncCallback(DatosLlegados), objSocket);
if (NuevaConexion != null)
{
string ipClienteConectado = ((IPEndPoint)objSocket.RemoteEndPoint).Address.ToString();
int puertoClienteConectado = ((IPEndPoint)objSocket.RemoteEndPoint).Port;
NuevaConexion(ipClienteConectado, puertoClienteConectado);
}
}
catch (Exception ex)
{
if (DatosErrores != null)
this.DatosErrores(MethodBase.GetCurrentMethod().Name, ex.Message);
}
}
private void DatosLlegados(IAsyncResult iAr)
{
Socket objSocket = (Socket)iAr.AsyncState;
try
{
int tamanioDatosRecibidos = objSocket.EndReceive(iAr);
if (tamanioDatosRecibidos > 0)
{
byte[] bytesDatosReales = new byte[tamanioDatosRecibidos];
Array.Copy(bytesDatos, bytesDatosReales, tamanioDatosRecibidos);
string txtDatosReales = Encoding.ASCII.GetString(bytesDatosReales);
if (DatosRecibidos != null)
{
string ipClienteConectado = ((IPEndPoint)objSocket.RemoteEndPoint).Address.ToString();
int puertoClienteConectado = ((IPEndPoint)objSocket.RemoteEndPoint).Port;
this.DatosRecibidos(objSocket, ipClienteConectado, puertoClienteConectado, txtDatosReales);
}
objSocket.BeginReceive(bytesDatos, 0, bytesDatos.Length, SocketFlags.None, new AsyncCallback(DatosLlegados), objSocket);
}
else
{
EliminarCliente(objSocket);
}
}
catch (SocketException exSocket)
{
if (exSocket.SocketErrorCode == SocketError.ConnectionReset)
EliminarCliente(objSocket);
else
{
if (DatosErrores != null)
this.DatosErrores(MethodBase.GetCurrentMethod().Name, exSocket.Message);
}
}
catch (Exception ex)
{
if (DatosErrores != null)
this.DatosErrores(MethodBase.GetCurrentMethod().Name, ex.Message);
}
}
Siempre que se envia un dato al socket, se entra por este metodo. Cuando se pierde la conexión, también se entra por este metodo, solo que el tamanio de bytes es 0, entonces es cuando sabes que se ha perdido la conexión, fijate en la condicional
Código:
if (tamanioDatosRecibidos > 0)
{
//Sigue conectado
}else{
//Se ha perdido la conexion.
}
__________________ Charlie. |