elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Usando Git para manipular el directorio de trabajo, el índice y commits (segunda parte)


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Problema con Sockets C#
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: 1 [2] Ir Abajo Respuesta Imprimir
Autor Tema: Problema con Sockets C#  (Leído 7,186 veces)
DeS_TRoZaDo

Desconectado Desconectado

Mensajes: 16



Ver Perfil WWW
Re: Problema con Sockets C#
« Respuesta #10 en: 10 Noviembre 2010, 01:01 am »

Asi funciona:

Código
  1. while (bytesRecibidos < longitud)
  2.            {
  3.                i = stream.Read(bytes, bytesRecibidos, 1);
  4.                bytesRecibidos += i;
  5.            }
  6.            datos = System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Length);
  7.            return datos;
  8.  

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??


En línea

Lunfardo


Desconectado Desconectado

Mensajes: 568


Ver Perfil
Re: Problema con Sockets C#
« Respuesta #11 en: 10 Noviembre 2010, 01:04 am »

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 ?


En línea

DeS_TRoZaDo

Desconectado Desconectado

Mensajes: 16



Ver Perfil WWW
Re: Problema con Sockets C#
« Respuesta #12 en: 10 Noviembre 2010, 01:05 am »

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 :)
« Última modificación: 10 Noviembre 2010, 01:08 am por DeS_TRoZaDo » En línea

[D4N93R]
Wiki

Desconectado Desconectado

Mensajes: 1.646


My software never has bugs. Its just features!


Ver Perfil WWW
Re: Problema con Sockets C#
« Respuesta #13 en: 10 Noviembre 2010, 01:22 am »

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! :)
En línea

DeS_TRoZaDo

Desconectado Desconectado

Mensajes: 16



Ver Perfil WWW
Re: Problema con Sockets C#
« Respuesta #14 en: 10 Noviembre 2010, 09:54 am »

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
En línea

Choclito

Desconectado Desconectado

Mensajes: 99



Ver Perfil
Re: Problema con Sockets C#
« Respuesta #15 en: 11 Noviembre 2010, 18:10 pm »

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

ServidorPaquete

Código
  1. private UdpClient cliente;      
  2.   private IPEndPoint puntoRecepcion;
  3.  
  4.   // inicializa las variables y el subproceso para recibir paquetes
  5.   private void ServidorPaquetesForm_Load( object sender, EventArgs e )
  6.   {
  7.      cliente = new UdpClient(50000);
  8.      puntoRecepcion = new IPEndPoint(new IPAddress(0), 0);
  9.      Thread lecturaThread = new Thread(new ThreadStart(EsperarPaquetes));
  10.      lecturaThread.Start();                                    
  11.   }
  12.  
  13.   // cierra el servidor
  14.   private void ServidorPaquetesForm_FormClosing( object sender,
  15.      FormClosingEventArgs e )
  16.   {        
  17.      System.Environment.Exit( System.Environment.ExitCode );
  18.   } // fin del método ServidorPaquetesForm_FormClosing
  19.  
  20.   // delegado que permite llamar al método MostrarMensaje
  21.   // en el subproceso que crea y mantiene la GUI
  22.   private delegate void DisplayDelegate( string message );  
  23.  
  24.   // el método MostrarMensaje establece la propiedad Text de mostrarTextBox
  25.   // de una manera segura para el proceso
  26.   private void MostrarMensaje( string mensaje )
  27.   {
  28.      // si la modificación de mostrarTextBox no es segura para el subproceso
  29.      if ( mostrarTextBox.InvokeRequired )
  30.      {
  31.         // usa el método heredado Invoke para ejecutar MostrarMensaje
  32.         // a través de un delegado
  33.         Invoke( new DisplayDelegate( MostrarMensaje ),          
  34.            new object[] { mensaje } );                          
  35.      } // fin de if
  36.      else // sí se puede modificar mostrarTextBox en el subproceso actual
  37.         mostrarTextBox.Text += mensaje;
  38.   }
  39.  
  40.   // espera a que llegue un paquete
  41.   public void EsperarPaquetes()
  42.   {
  43.      while ( true )
  44.      {
  45.         // prepara el paquete
  46.         byte[] datos = cliente.Receive( ref puntoRecepcion );
  47.         MostrarMensaje( "\r\nSe recibió paquete:" +
  48.            "\r\nLongitud: " + datos.Length +
  49.            "\r\nContenido: " +
  50.            System.Text.Encoding.ASCII.GetString( datos ) );          
  51.  
  52.         // devuelve (eco) la información del paquete de vuelta al cliente
  53.         MostrarMensaje( "\r\n\r\nEnviando de vuelta datos al cliente..." );
  54.         cliente.Send( datos, datos.Length, puntoRecepcion );
  55.         MostrarMensaje( "\r\nPaquete enviado\r\n" );
  56.      } // fin de while
  57.   }  
  58.  
ClientePaquete

Código
  1. private UdpClient cliente;      
  2.   private IPEndPoint puntoRecepcion;
  3.  
  4.   // inicializa las variables y el subproceso para recibir paquetes
  5.   private void ClientePaquetesForm_Load( object sender, EventArgs e )
  6.   {
  7.      puntoRecepcion = new IPEndPoint( new IPAddress( 0 ), 0 );
  8.      cliente = new UdpClient( 50001 );                        
  9.      Thread subproceso =                                        
  10.         new Thread( new ThreadStart( EsperarPaquetes ) );    
  11.      subproceso.Start();                                        
  12.   } // fin del método ClientePaquetesForm_Load
  13.  
  14.   // cierra el cliente
  15.   private void ClientePaquetesForm_FormClosing( object sender,
  16.      FormClosingEventArgs e )
  17.   {
  18.      System.Environment.Exit( System.Environment.ExitCode );
  19.   } // fin del método ClientePaquetesForm_FormClosing
  20.  
  21.   // delegado que permite llamar al método MostrarMensaje
  22.   // en el subproceso que crea y mantiene la GUI
  23.   private delegate void DisplayDelegate( string message );  
  24.  
  25.   // el método MostrarMensaje establece la propiedad Text de mostrarTextBox
  26.   // de una manera segura para el subproceso
  27.   private void MostrarMensaje( string mensaje )
  28.   {
  29.      // si la modificación de mostrarTextBox no es segura para el subproceso
  30.      if ( mostrarTextBox.InvokeRequired )
  31.      {
  32.         // usa el método heredado Invoke para ejecutar MostrarMensaje
  33.         // a través de un delegado
  34.         Invoke( new DisplayDelegate( MostrarMensaje ),          
  35.            new object[] { mensaje } );                          
  36.      } // fin de if
  37.      else // sí se puede modificar mostrarTextBox en el subproceso actual
  38.         mostrarTextBox.Text += mensaje;
  39.   } // fin del método MostrarMensaje
  40.  
  41.   // envía un paquete
  42.   private void entradaTextBox_KeyDown( object sender, KeyEventArgs e )
  43.   {
  44.      if ( e.KeyCode == Keys.Enter )
  45.      {
  46.         // crea un paquete (datagrama) como objeto string
  47.         string paquete = entradaTextBox.Text;  
  48.         mostrarTextBox.Text +=
  49.            "\r\nEnviando paquete que contiene: " + paquete;
  50.  
  51.         // convierte el paquete en arreglo de bytes
  52.         byte[] datos = System.Text.Encoding.ASCII.GetBytes( paquete );
  53.  
  54.         // envía el paquete al servidor en el puerto 50000              
  55.         cliente.Send( datos, datos.Length, "127.0.0.1", 50000 );
  56.         mostrarTextBox.Text += "\r\nPaquete enviado\r\n";
  57.         entradaTextBox.Clear();
  58.      } // fin de if
  59.   } // fin del método entradaTextBox_KeyDown
  60.  
  61.   // espera a que lleguen los paquetes
  62.   public void EsperarPaquetes()
  63.   {
  64.      while ( true )
  65.      {
  66.         // recibe arreglo de bytes del servidor
  67.         byte[] datos = cliente.Receive( ref puntoRecepcion );
  68.  
  69.         // envía el paquete de datos al control TextBox
  70.         MostrarMensaje( "\r\nPaquete recibido:" +
  71.            "\r\nLongitud: " + datos.Length + "\r\nContenido: " +
  72.            System.Text.Encoding.ASCII.GetString( datos ) + "\r\n" );
  73.      } // fin de while
  74.   } // fin del método EsperarPaquetes

En línea

Páginas: 1 [2] Ir Arriba Respuesta Imprimir 

Ir a:  
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines