Ver Mensaje Individual
  #11 (permalink)  
Antiguo 25/03/2008, 09:31
chcma
 
Fecha de Ingreso: junio-2003
Ubicación: Asturias
Mensajes: 2.429
Antigüedad: 20 años, 11 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.