Autor
|
Tema: Problema con Sockets C# (Leído 7,187 veces)
|
DeS_TRoZaDo
|
Asi funciona: 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??
|
|
|
En línea
|
|
|
|
Lunfardo
Desconectado
Mensajes: 568
|
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
|
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
Mensajes: 1.646
My software never has bugs. Its just features!
|
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
|
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
Mensajes: 99
|
ola bueno ahi dejo mi granito de arena si ayuda en algo chevre ServidorPaquete 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 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
|
|
|
En línea
|
|
|
|
|
|