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

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  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,188 veces)
DeS_TRoZaDo

Desconectado Desconectado

Mensajes: 16



Ver Perfil WWW
Problema con Sockets C#
« en: 9 Noviembre 2010, 21:26 pm »

Buenas.

Tengo un servidor, que recibe conexiones de muchos clientes, lo hago usando las clases TcpListener para el servidor y TcpClient para los clientes con su respectivo NetworkStream para enviar y recibir datos.

Entonces, quiero que veais el codigo a ver si veis algo mal, por que si lo depuro, y voy linea por linea con el F11 dandole paso yo funciona perfecto, en el momento que lo dejo libre, falla, por lo cual no puedo saber donde es, un ejemplo, para enviar un string a la conexion hago esto en el que va a recibir:

Código
  1. public string recibirString()
  2.        {
  3.            if (stream == null)
  4.                stream = conexion.GetStream();
  5.            int longitud = recibirLongitud();
  6.            //stream = conexion.GetStream();
  7.            Byte[] bytes = new Byte[longitud];
  8.            Int32 i;
  9.            String datos = String.Empty;
  10.            if ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
  11.            {
  12.                datos = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
  13.                return datos;
  14.            }
  15.            return datos;
  16.        }
  17.  

y recibirLongitud es:

Código
  1. private int recibirLongitud()
  2.        {
  3.            if (stream == null)
  4.                stream = conexion.GetStream();
  5.            Int32 longitud = 0;
  6.            Byte[] longitudByte = new Byte[4];
  7.            //stream = conexion.GetStream();
  8.            stream.Read(longitudByte, 0, longitudByte.Length);
  9.            longitud = BitConverter.ToInt32(longitudByte, 0);
  10.            return longitud;
  11.        }
  12.  

Eso el que lo recibe, y el que envia hace esto cuando ese esta esperando a recibir:

Código
  1. public bool enviarString(string mensaje)
  2.        {
  3.            if (stream == null)
  4.                stream = conexion.GetStream();
  5.            try
  6.            {
  7.                Byte[] paquete = System.Text.Encoding.UTF8.GetBytes(mensaje);
  8.                enviarLongitud(paquete);
  9.                stream.Write(paquete, 0, paquete.Length);
  10.                stream.Flush();
  11.                return true;
  12.            }
  13.            catch { return false; }
  14.        }
  15.  

donde enviarLongitud es:

Código
  1. private bool enviarLongitud(Byte[] paquete)
  2.        {
  3.            if (stream == null)
  4.                stream = conexion.GetStream();
  5.            try
  6.            {
  7.                int longitud = paquete.Length;
  8.                byte[] longitudBytes = BitConverter.GetBytes(longitud);
  9.                stream.Write(longitudBytes, 0, longitudBytes.Length);
  10.                stream.Flush();
  11.                return true;
  12.            }
  13.            catch { return false; }
  14.        }
  15.  

Graaaacias por leer.

Algun comentario?  :(

EDITO: stream en este caso seria el NetworkStream y conexion es el TcpClient.


En línea

Lunfardo


Desconectado Desconectado

Mensajes: 568


Ver Perfil
Re: Problema con Sockets C#
« Respuesta #1 en: 9 Noviembre 2010, 23:44 pm »

la lectura la tenes que hacer con un while, hasta que hayas leido la misma longuitud de caracter que los esperados.


no basta con un simple "read" por que por el protocolo TCP los mensajes llegan cortados
Código
  1. while (BytesRecidos < BytesEsperados) {
  2. if ((B = ELStream.Read(byteBuffer, BytesRecibidos,
  3.       BytesRecibidos - BytesEsperados)) == 0) {
  4.       Console.WriteLine("fallo");
  5.        break;
  6.        }
  7.  
  8. BytesRecibidos += B;
  9. }
  10.  
  11.  


Espero que se entienda xD , si empieza a leer 0 bytes, es que algo funciona mal =)



« Última modificación: 9 Noviembre 2010, 23:51 pm por SmogMX » En línea

DeS_TRoZaDo

Desconectado Desconectado

Mensajes: 16



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

Estas seguro de eso? yo esque internamente no se como funciona, pero recibir recibe bien, el problema es que despues de recibir, en algun momento, el stream o el tcpClient se peta y da un DisposedObject, pero recibir, cuando recibe, recibe bien.

EDIT: Lo que realmente me jode, es que si pongo un punto de interrupcion, y voy paso a paso, en el que envia los datos, con el F11, haciendolo, va todo perfecto, le mande lo que le mande y las veces que se lo mande, pero en el momento que quito el punto de interrupcion, se peta. :S:S me esta jodiendo mucho eso.
« Última modificación: 10 Noviembre 2010, 00:09 am por DeS_TRoZaDo » En línea

Lunfardo


Desconectado Desconectado

Mensajes: 568


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

seguro estoy,


proba cerrando los sockets una vez terminada la funcion.


stream.Close();


la longuitud la podes representar con un int de 4 bytes, por lo menos yo lo hacia asi para saber el peso de lo esperado sin complicaciones.
« Última modificación: 10 Noviembre 2010, 00:19 am por SmogMX » En línea

DeS_TRoZaDo

Desconectado Desconectado

Mensajes: 16



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

Ya he probado con eso, lo que pasa es que la conexion es continua, si hago el stream.Close() peta por todos lados, por que tanto cliente como servidor estan en continua comunicacion, creo que igual he encontrado el problema, por que he reducido el tamaño de los paquetes que envia y ya no peta, es decir, hay un maximo para enviar de 1 tirada? se puede aumentar si lo hay? solo estoy enviando puro string :S me extraña que sea algo de esto por que entonces ya si quisiera enviar una imagen me puede dar algo pero.... si reduciendo el tamaño a enviar ha funcionado.... :S
En línea

Lunfardo


Desconectado Desconectado

Mensajes: 568


Ver Perfil
Re: Problema con Sockets C#
« Respuesta #5 en: 10 Noviembre 2010, 00:22 am »

hace lo del while que te puse al principio , ya que i y bytes.Lenght pueden no coincidir, te tenes que asegurar que lo haga antes de decifrarlo
Código
  1.  
  2.  if ((i = stream.Read(bytes, 0, bytes.Length)) != 0)
  3.            {
  4.                datos = System.Text.Encoding.UTF8.GetString(bytes, 0, i);
  5.                return datos;
  6.            }
  7.  
  8.  
  9. fijate asi
  10.  
  11.  
  12. int recibidos=0;int Rcvd;
  13. while (recibidos < bytes.Lenght) {
  14.   if ((Rcvd = stream.Read(bytes, recibidos,
  15.   bytes.Length - recibidos)) == 0) {
  16.   Console.WriteLine("error");
  17.   break;
  18. }
  19.  
  20. datos = System.Text.Encoding.UTF8.GetString(bytes, 0, bytes.Lenght);
  21. return datos;
  22.  
  23.  

« Última modificación: 10 Noviembre 2010, 00:28 am por SmogMX » En línea

DeS_TRoZaDo

Desconectado Desconectado

Mensajes: 16



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

Voy a probarlo ahora mismo, otra duda, el stream = conexion.GetStream(); cuando hay que hacerlo? con 1 vez basta? o cada vez que vaya a enviar y recibir?
En línea

Lunfardo


Desconectado Desconectado

Mensajes: 568


Ver Perfil
Re: Problema con Sockets C#
« Respuesta #7 en: 10 Noviembre 2010, 00:33 am »

con una vez basta, pero el servidor y el cliente tiene que estar sintonizados para cuando el cliente termine de recibir lo que el servidor tenga para enviar ambos cierren los sockets, sino el servidor no podria recibir otra solicitud.

ademas una vez que se termine el proceso, el servidor deberia quedar parado en un punto de espera para responde a una nueva solicitud.

te aconsejo que leas tcp/ip sockets in c # si te quedan muchas dudas
En línea

DeS_TRoZaDo

Desconectado Desconectado

Mensajes: 16



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

la lectura la tenes que hacer con un while, hasta que hayas leido la misma longuitud de caracter que los esperados.


no basta con un simple "read" por que por el protocolo TCP los mensajes llegan cortados
Código
  1. while (BytesRecidos < BytesEsperados) {
  2. if ((B = ELStream.Read(byteBuffer, BytesRecibidos,
  3.       BytesRecibidos - BytesEsperados)) == 0) {
  4.       Console.WriteLine("fallo");
  5.        break;
  6.        }
  7.  
  8. BytesRecibidos += B;
  9. }
  10.  
  11.  


Espero que se entienda xD , si empieza a leer 0 bytes, es que algo funciona mal =)



En el if, el bytesRecibidos - bytesEsperado mmmm no va bien bien, bytesRecibidos la primera vez es 0 por que hemos recibido 0, y los esperados son 1000 alomejor, 0 - 1000 peta por argumentException que querias poner exactamente? Se ha quedado asi:

Código
  1. public string recibirString()
  2.        {
  3.            if (stream == null)
  4.                stream = conexion.GetStream();
  5.            int longitud = recibirLongitud();
  6.            Byte[] bytes = new Byte[longitud];
  7.            Int32 i;
  8.            String datos = String.Empty;
  9.            int bytesRecibidos = 0;
  10.            while (bytesRecibidos < longitud)
  11.            {
  12.                if ((i = stream.Read(bytes, bytesRecibidos, bytesRecibidos - longitud)) == 0)
  13.                {
  14.                    break;
  15.                }
  16.                bytesRecibidos += i;
  17.            }
  18.            return datos;
  19.        }
  20.  

Si, esta bastante controlado el tema de los sockets, ya te digo que el programa funciona, si el paquete no es grande, y aun siendo grande, si lo hago linea a linea, tambien va.
En línea

Lunfardo


Desconectado Desconectado

Mensajes: 568


Ver Perfil
Re: Problema con Sockets C#
« Respuesta #9 en: 10 Noviembre 2010, 00:44 am »

tenes razon , es BytesEsperado-BytesRecibidos lo bytes que tiene que tratar de leer
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