Problema con Sockets C#

Iniciado por DeS_TRoZaDo, 9 Noviembre 2010, 21:26 PM

0 Miembros y 1 Visitante están viendo este tema.

DeS_TRoZaDo

Asi funciona:

Código (csharp) [Seleccionar]

while (bytesRecibidos < longitud)
            {
                i = stream.Read(bytes, bytesRecibidos, 1);
                bytesRecibidos += i;
            }
            datos = System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
            return datos;


el stream.Read devuelve 1 o 0? o que valores devuelve? por que funciona igual con un 1 como ultimo parametro y con BytesEsperado-BytesRecibidos??

Lunfardo

stream.Read devuelve la cantidad de Bytes que pudo leer,

si pones 1 en vez de BytesEsperados-BytesRecibidos vas a estar leyendo de a un byte.


ya funciona todo bien ?

DeS_TRoZaDo

#12
Si, muchas gracias, ademas voy a dejar lo de bytesEsperados - BytesRecibidos, pero no entiendo muy bien por que asi va y como lo tenia yo no pero bueno :S lo estudiare mejor mañana que tengo que madrugar xD

AAAAAhhh vale vale, es por si de una tacada, no puede leer entero el paquete, vuelve a leer lo que le falta, por eso le sumas la "i" que es lo que ha podido leer, vaaale vale, muchas gracias :)

[D4N93R]

Acá en este subforo hay dos guías buenas de Sockets y TcpListener/Client , están en el recopilatorio, solo en caso de que no las hayan leído! :)

DeS_TRoZaDo

Si, me los he leido, pero son algo basicos para este caso en concreto, que ya estaba todo eso hecho y que fallaba cuando el paquete era demasiado grande y se partia en 2 y yo solo leia el primer trozo que llegaba, por otro lado aprovecho para preguntar una duda, con un TcpListener por 1 puerto, y 1 solo TcpClient a ese puerto, no puedo tener 2 threads mandando datos es decir, por ejemplo, si quisiera estar enviando por un lado informacion de posibles errores cuando salte, y por otro lado estar contestando las peticiones del servidor? :S No se si me explico, creo que me toca abrir 2 puertos, pero no quiero hacer eso jeje entonces quizas haya alguna manera de que envie uno un poco, el otro otro poco, y asi parezca que lo hacen los dos a al vez y en realidad lo hacen de 1 en 1? Se me entiende? xD

Choclito

ola bueno ahi dejo mi granito de arena si ayuda en algo chevre

ServidorPaquete

Código (csharp) [Seleccionar]
private UdpClient cliente;       
   private IPEndPoint puntoRecepcion;
   
   // inicializa las variables y el subproceso para recibir paquetes
   private void ServidorPaquetesForm_Load( object sender, EventArgs e )
   {
      cliente = new UdpClient(50000);
      puntoRecepcion = new IPEndPoint(new IPAddress(0), 0);
      Thread lecturaThread = new Thread(new ThreadStart(EsperarPaquetes));
      lecturaThread.Start();                                   
   }

   // cierra el servidor
   private void ServidorPaquetesForm_FormClosing( object sender,
      FormClosingEventArgs e )
   {         
      System.Environment.Exit( System.Environment.ExitCode );
   } // fin del método ServidorPaquetesForm_FormClosing

   // delegado que permite llamar al método MostrarMensaje
   // en el subproceso que crea y mantiene la GUI
   private delegate void DisplayDelegate( string message ); 

   // el método MostrarMensaje establece la propiedad Text de mostrarTextBox
   // de una manera segura para el proceso
   private void MostrarMensaje( string mensaje )
   {
      // si la modificación de mostrarTextBox no es segura para el subproceso
      if ( mostrarTextBox.InvokeRequired )
      {
         // usa el método heredado Invoke para ejecutar MostrarMensaje
         // a través de un delegado
         Invoke( new DisplayDelegate( MostrarMensaje ),         
            new object[] { mensaje } );                         
      } // fin de if
      else // sí se puede modificar mostrarTextBox en el subproceso actual
         mostrarTextBox.Text += mensaje;
   }

   // espera a que llegue un paquete
   public void EsperarPaquetes()
   {
      while ( true )
      {
         // prepara el paquete
         byte[] datos = cliente.Receive( ref puntoRecepcion );
         MostrarMensaje( "\r\nSe recibió paquete:" +
            "\r\nLongitud: " + datos.Length +
            "\r\nContenido: " +
            System.Text.Encoding.ASCII.GetString( datos ) );           

         // devuelve (eco) la información del paquete de vuelta al cliente
         MostrarMensaje( "\r\n\r\nEnviando de vuelta datos al cliente..." );
         cliente.Send( datos, datos.Length, puntoRecepcion );
         MostrarMensaje( "\r\nPaquete enviado\r\n" );
      } // fin de while
   } 

ClientePaquete

Código (csharp) [Seleccionar]
private UdpClient cliente;       
   private IPEndPoint puntoRecepcion;

   // inicializa las variables y el subproceso para recibir paquetes
   private void ClientePaquetesForm_Load( object sender, EventArgs e )
   {
      puntoRecepcion = new IPEndPoint( new IPAddress( 0 ), 0 );
      cliente = new UdpClient( 50001 );                       
      Thread subproceso =                                       
         new Thread( new ThreadStart( EsperarPaquetes ) );   
      subproceso.Start();                                       
   } // fin del método ClientePaquetesForm_Load

   // cierra el cliente
   private void ClientePaquetesForm_FormClosing( object sender,
      FormClosingEventArgs e )
   {
      System.Environment.Exit( System.Environment.ExitCode );
   } // fin del método ClientePaquetesForm_FormClosing

   // delegado que permite llamar al método MostrarMensaje
   // en el subproceso que crea y mantiene la GUI
   private delegate void DisplayDelegate( string message ); 

   // el método MostrarMensaje establece la propiedad Text de mostrarTextBox
   // de una manera segura para el subproceso
   private void MostrarMensaje( string mensaje )
   {
      // si la modificación de mostrarTextBox no es segura para el subproceso
      if ( mostrarTextBox.InvokeRequired )
      {
         // usa el método heredado Invoke para ejecutar MostrarMensaje
         // a través de un delegado
         Invoke( new DisplayDelegate( MostrarMensaje ),         
            new object[] { mensaje } );                         
      } // fin de if
      else // sí se puede modificar mostrarTextBox en el subproceso actual
         mostrarTextBox.Text += mensaje;
   } // fin del método MostrarMensaje

   // envía un paquete
   private void entradaTextBox_KeyDown( object sender, KeyEventArgs e )
   {
      if ( e.KeyCode == Keys.Enter )
      {
         // crea un paquete (datagrama) como objeto string
         string paquete = entradaTextBox.Text;   
         mostrarTextBox.Text +=
            "\r\nEnviando paquete que contiene: " + paquete;

         // convierte el paquete en arreglo de bytes
         byte[] datos = System.Text.Encoding.ASCII.GetBytes( paquete );

         // envía el paquete al servidor en el puerto 50000               
         cliente.Send( datos, datos.Length, "127.0.0.1", 50000 );
         mostrarTextBox.Text += "\r\nPaquete enviado\r\n";
         entradaTextBox.Clear();
      } // fin de if
   } // fin del método entradaTextBox_KeyDown

   // espera a que lleguen los paquetes
   public void EsperarPaquetes()
   {
      while ( true )
      {
         // recibe arreglo de bytes del servidor
         byte[] datos = cliente.Receive( ref puntoRecepcion );

         // envía el paquete de datos al control TextBox
         MostrarMensaje( "\r\nPaquete recibido:" +
            "\r\nLongitud: " + datos.Length + "\r\nContenido: " +
            System.Text.Encoding.ASCII.GetString( datos ) + "\r\n" );
      } // fin de while
   } // fin del método EsperarPaquetes