none
Error al recibir y enviar datos por TcpClient / TcpListener RRS feed

  • Pregunta

  • Hola, estoy desarrollando una aplicación cliente-servidor usando el protocolo TCP y tengo un problema al recibir/enviar los datos, al crear la array de bytes en la que se reciben los datos la he puesto como: byte[] data = new byte[512];

    Pues al recibir los datos recibo los datos correctos, por ejemplo: hola, pero ademas recibo los restantes 508 bytes como caracteres ''

    Como puedo solucionar esto? 

    Este es un fragmento del codigo en el cual envio y recibo los datos:

    //Listener es un TcpListener sin valor 'TcpListener Listener;'
    Listener = new TcpListener(IPAddress.Any,receiveport);
    Listener.Start();
    //Reciver es un Task 
     static void Receiver()
                    {
                        while(true)
                        {                       
                            try
                            {
                                Socket s = Listener.AcceptSocket();                           
                                Task ESCK = new Task(() => ProcessSocket(s));
                                ESCK.Start();        
                            }
                            catch (Exception ex) { }                                     
                        }                      
                    }
    static void ProcessSocket(Socket sck)
                    {
                        while (true)
                        {
                            try
                            {
                                byte[] data = new byte[512];
                                sck.Receive(data);
                                string message = Encoding.UTF8.GetString(data);
                                message = sDecrypt(message, 5);                             
                                string[] packet = message.Split(char.Parse(";"));
                                bytesrecived = bytesrecived + Encoding.UTF8.GetByteCount(message);
                                packetsreceived++;
                                 string[] ip = sck.RemoteEndPoint.ToString().Split(char.Parse(":")); 
                        SendData(ip[0], sendport, "Message Reply");
                            }
                            catch (Exception ex) { }
                           
                        }                   
                    }
    
     static void SendData(string ip1, int port, string message)
                    {                    
                        TcpClient tclient = new TcpClient();
                        Stream stm;
                        tclient.Connect(ip1, port);                   
                        byte[] dta = new byte[512];
                        message = sEncrypt(message, 5); 
                        dta = Encoding.UTF8.GetBytes(message);
                        stm = tclient.GetStream();
                        stm.Write(dta, 0, dta.Length);
                        stm.Close();
                        tclient.Close();
                        packetssent++;
                        bytessent = bytessent + Convert.ToInt64(Encoding.UTF8.GetByteCount(message.ToCharArray()));                  
                    }
    
    static string sEncrypt(string value, int index)
                   {
                       string result = "";
                       char[] charr = value.ToCharArray();
                       foreach (char ch in charr)
                       {
                           char let = (char)(ch + index);
                           result += let;
                       }
                       return result;
                   }
                   static string sDecrypt(string value, int index)
                   {
                       string result = "";
                       char[] charr = value.ToCharArray();
                       foreach (char ch in charr)
                       {
                           char let = (char)(ch - index);
                           result += let;
                       }
                       return result;
                   }

    Este es el codigo del servidor, el del cliente es bastante similar, pero presenta otro problema, quando el servidor responde al cliente, este recibe la respuesta infinitas veces:

      static void SendData(string ip1,  string message)
            {      
                    byte[] dta = new byte[512];
                    string msg = message;
                    message = sEncrypt(message, 5);
                    dta = Encoding.UTF8.GetBytes(message);
                    stm.Write(dta,0,dta.Length);
                Console.ForegroundColor = ConsoleColor.Green;
                Write("SENT: " + msg);
                Console.ForegroundColor = ConsoleColor.White;          
                    
            }
     static void Receiver()
            {
                while (true)
                {
                    try
                    {
                        Socket s = Listener.AcceptSocket();
                        Task ESCK = new Task(() => ProcessSocket(s));
                        ESCK.Start();
                    }
                    catch (Exception ex) { }                
                }
            }
            static void ProcessSocket(Socket sck)
            {
                while (true)
                {
                    try
                    {
                        byte[] data = new byte[512];
                        sck.Receive(data);
                        string message = Encoding.UTF8.GetString(data);
                        message = sDecrypt(message, 5);                     
                        string[] packet = message.Split(char.Parse(";"));                   
                        Write("Recived:: " + message);
                    }
                    catch (Exception ex) { }
    
                }
            }

    martes, 5 de agosto de 2014 22:15

Respuestas

  • Esa es la razón por la cual el Receive() devuelve un int que representa la cantidad de datos útiles que se han copiado al búfer.

    Lo clásico es capturar el valor devuelto y usarlo.

    GetString() tiene una versión de tres argumentos. En el tercero es donde lo usas.

    • Marcado como respuesta Pau CP martes, 5 de agosto de 2014 22:47
    martes, 5 de agosto de 2014 22:29
  • int hasta = sck.Receive(data);
    string message = Encoding.UTF8.GetString(data, 0, hasta);
    

    • Marcado como respuesta Pau CP martes, 5 de agosto de 2014 22:52
    martes, 5 de agosto de 2014 22:47

Todas las respuestas

  • Esa es la razón por la cual el Receive() devuelve un int que representa la cantidad de datos útiles que se han copiado al búfer.

    Lo clásico es capturar el valor devuelto y usarlo.

    GetString() tiene una versión de tres argumentos. En el tercero es donde lo usas.

    • Marcado como respuesta Pau CP martes, 5 de agosto de 2014 22:47
    martes, 5 de agosto de 2014 22:29
  • int hasta = sck.Receive(data);
    string message = Encoding.UTF8.GetString(data, 0, hasta);
    

    • Marcado como respuesta Pau CP martes, 5 de agosto de 2014 22:52
    martes, 5 de agosto de 2014 22:47