Algun experto en Thread y sockets en C#?

Buenas a todos,

Ando haciendo un servicio para windows con C# que espera conexiones de formularios a traves de sockets y lanzo hilos en el servicio por cada cliente que conecta.
El problema que tengo es que cuando desconecto a un cliente, el servicio se para y deja sin conexion al resto de clientes, o si solo tengo un cliente conectado y se desconecta, el servicio ya no acepta mas conexiones. Os pego el codigo que es bastante conciso para ver si me podeis echar una manilla

El servicio ejecuta en OnStart()
this.tcpListener = new TcpListener(ipEnd);
this.listenThread = new Thread(new ThreadStart(ListenForClients));
this.listenThread.Start();


private void ListenForClients()
{
  this.tcpListener.Start();

  while (true)
  {
    //blocks until a client has connected to the server
    TcpClient client = this.tcpListener.AcceptTcpClient();

    //create a thread to handle communication
    //with connected client
    Thread clientThread = new Thread(new ParameterizedThreadStart(HandleClientComm));
    clientThread.Start(client);
  }
}


private void HandleClientComm(object client)
{
  TcpClient tcpClient = (TcpClient)client;
  NetworkStream clientStream = tcpClient.GetStream();

  byte[] message = new byte[4096];
  int bytesRead;

  while (true)
  {
    bytesRead = 0;

    try
    {
      //blocks until a client sends a message
      bytesRead = clientStream.Read(message, 0, 4096);
    }
    catch
    {
      //a socket error has occured
      break;
    }

    if (bytesRead == 0)
    {
      //the client has disconnected from the server
      break;
    }

    //message has successfully been received
    ASCIIEncoding encoder = new ASCIIEncoding();
    System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
  }

  tcpClient.Close();
}


Cuando desconecto el cliente, el hilo se cierra correctamente por el "if (bytesRead == 0)" y despues ejecutando "tcpClient.Close()"

¿Porque si un unico thread se cierra el resto de hilos "desaparecen"

Muchas gracias por cualquier aportacion
Buenas la verdad es que yo no tengo mucha idea de sockets ya que lo que e visto a sido mas o menos por mi cuenta (estoy estudiando DAM y la asignatura principal es .NET) pero te puedo decir que un dia intente hacer un chat simple que constaba de un servidor y varios clientes y la verdad es que tuve varios problemas y mi problema principal era muy parecido al tuyo y este era que al desconectar o cerar un cliente conectado al servidor este dejaba de funcionar.

Viendo un poco tu codigo me gustaria saber que hacer exactamente en el break que e puesto en negrita ya que en c# ando un poco perdido

private void HandleClientComm(object client)
{
  TcpClient tcpClient = (TcpClient)client;
  NetworkStream clientStream = tcpClient.GetStream();

  byte[] message = new byte[4096];
  int bytesRead;

  while (true)
  {
    bytesRead = 0;

    try
    {
      //blocks until a client sends a message
      bytesRead = clientStream.Read(message, 0, 4096);
    }
    catch
    {
      //a socket error has occured
      break;
    }

   [b] if (bytesRead == 0)
    {
      //the client has disconnected from the server
      break;
    }[/b]

    //message has successfully been received
    ASCIIEncoding encoder = new ASCIIEncoding();
    System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
  }

  tcpClient.Close();
}



Me imagino que lo que hace es salir del bucle o por lo menos intentarlo por eso me gustaria que mirases bien que ese break "solo" sale del bucle para asi poder ejecutar el .Close del tcpclient

Saludos y siento no ser de gran utilidad
Buenas,
Pues debemos andar en las mismas }:/

Ese break que dices se ejecuta cuando un cliente se desconecta del socket, ya que el Read devuelve 0 bytes recibidos. Como todos los break, te sacan del bucle donde se encuentre, por lo que sale del while(true) y ejecuta el tcpClient.Close();
Lo que pasa es que despues de eso, el resto de hilos que se encuentran en ejecucion parecen haber muerto, ya que ni el hilo que espera los nuevos clientes ni los hilos de conexion con el resto de clientes paracen seguir adelante.

[decaio]
No consigo ver ningún error en el código, pero te recomendaría que convirtieses el servicio en una aplicacion winforms para depurar tranquilamente... cuando te funcione, lo pasas a servicio. Así lo hago yo siempre.

P.D. los sockets de .NET son una gran mierda... a mi me dan por culo a base de bién....

Saludos!
Lumeku escribió:No consigo ver ningún error en el código, pero te recomendaría que convirtieses el servicio en una aplicacion winforms para depurar tranquilamente... cuando te funcione, lo pasas a servicio. Así lo hago yo siempre.

P.D. los sockets de .NET son una gran mierda... a mi me dan por culo a base de bién....

Saludos!


gracias por el consejo de crearme el Form de pruebas, jejeje.
Acado de hacermelo y veo que los clientes se desconectan sin problemas. Conecto varios, desconecto solo uno y continua funcionando. Vamos, que el código en sí esta perfect! pero algo debe de tener de especial el servicio que no le gusta lo que le hago.
La pregunta puede ser:
¿Porque al matar o acabar un thread en un Service el resto de threads activos mueren??

A ver si alguien lo sabe
4 respuestas