Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: Dryken en 28 Diciembre 2012, 15:19 pm



Título: [SOLUCIONADO][C#] Evitar la lectura de la tecla intro en sockets tcp/ip
Publicado por: Dryken en 28 Diciembre 2012, 15:19 pm
He creado por modo consola 2 app que se comunican entre ellas, cliente y servidor. Lo típico, en el cliente escribes algo y el servidor lo recibe.

Funciona correctamente, pero el único "problema" si es que puede llamarse así es que en el servidor se muestra lo enviado desde el cliente pero con un salto de línea. Creo que el problema es que al pulsar la tecla intro para enviar, dicha tecla también se envía.

Llevo bastante tiempo intentando averiguar como solucionarlo pero ya tengo la mente quemada, ojalá algunos tenga la mente más fresca.

Servidor

Código
  1. using System.IO;
  2. using System.Diagnostics;
  3. using System.Text;
  4. using System.Threading;
  5. using System.Runtime.InteropServices;
  6. using Microsoft.Win32;
  7. using System;
  8. using System.Net.Sockets;
  9. using System.Net;
  10.  
  11. namespace socket_servidor{
  12. class Program{
  13.  
  14. public static void Main(string[] args){
  15.  
  16. Socket s = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  17.            IPEndPoint ep = new IPEndPoint (IPAddress.Any, 1238);
  18.  
  19.           try {
  20.               s.Bind (ep);
  21.               s.Listen (25);
  22.   Socket accepted = s.Accept();
  23.  
  24.                   Console.WriteLine("Conexion recibida\n");  
  25.  
  26.                   while(true){
  27.   byte[] buffer = new Byte[255];
  28.                   int rec = accepted.Receive(buffer,0,buffer.Length,0);
  29.                   string strData = Encoding.ASCII.GetString(buffer);
  30. Console.Write(">>> "+strData+"\n");
  31.                   }
  32.  
  33.             }catch {
  34.                   Console.WriteLine ("Error iniciando conexion");
  35.                   Console.ReadKey();
  36.                }
  37. }
  38. }
  39. }


Cliente

Código
  1. using System.IO;
  2. using System.Diagnostics;
  3. using System.Text;
  4. using System.Threading;
  5. using System.Runtime.InteropServices;
  6. using Microsoft.Win32;
  7. using System;
  8. using System.Net.Sockets;
  9. using System.Net;
  10.  
  11. namespace sockets{
  12. class Program{
  13.  
  14. public static void Main(string[] args){
  15.  
  16. Console.WriteLine ("Conectandose al servidor...");
  17.            Socket _S = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); // Socket de tipo TCP.
  18.            IPEndPoint ep = new IPEndPoint (IPAddress.Parse ("127.0.0.1"), 1238); // Ip - Puerto
  19.  
  20.           try {
  21.                _S.Connect (ep);
  22.                    Console.WriteLine ("Conectado correctamente.\n");
  23.  
  24.                    while(true){
  25.                     Console.Write(">>> ");
  26.             string text = Console.ReadLine();
  27.             byte[] data = Encoding.ASCII.GetBytes(text);
  28.             _S.Send(data);                  
  29.                    }
  30.  
  31.           }catch(Exception ex) {
  32.                 Console.WriteLine (ex.Message);
  33.                 Console.ReadKey();
  34.                }
  35.  
  36. }
  37. }
  38. }


Vamos, solucionar el salto de línea que produce la lectura de la tecla intro.

(http://img687.imageshack.us/img687/9921/socketsu.jpg)


Título: Re: [C#] Evitar la lectura de la tecla intro en sockets tcp/ip
Publicado por: spiritdead en 28 Diciembre 2012, 16:16 pm
yo cambiaria esto

Console.Write(">>> "+strData+"\n");
por
COnsole.Writeline(">>> "+strData);


Título: Re: [C#] Evitar la lectura de la tecla intro en sockets tcp/ip
Publicado por: seba123neo en 28 Diciembre 2012, 16:47 pm
no, al parecer es un problema del buffer y el string, el problema esta en el server.

en el server despues de la linea que dice "Listen", debe quedar asi el codigo para que funcione (pasalo a C#) te vas a dar cuenta de las diferencias.

Código
  1.            While True
  2.                Console.WriteLine("Esperando Conexion..." & vbLf)
  3.                Dim accepted As Socket = s.Accept()
  4.                Dim strData As String = ""
  5.  
  6.                While True
  7.                    Dim buffer As Byte() = New [Byte](254) {}
  8.                    Dim rec As Integer = accepted.Receive(buffer)
  9.                    strData += Encoding.ASCII.GetString(buffer, 0, rec)
  10.                    Console.Write(">>> " + strData & vbLf)
  11.                End While
  12.  
  13.            End While

con eso funciona.

saludos.


Título: Re: [C#] Evitar la lectura de la tecla intro en sockets tcp/ip
Publicado por: Dryken en 28 Diciembre 2012, 21:21 pm
Llevas razón seba123neo, acabo de ver tu code y la solución la he encontrado en esta línea

 
Código
  1. strData += Encoding.ASCII.GetString(buffer, 0, rec)

lo que he echo ha sido simplemnete colocar esta línea en el server para evitar los carácteres nulos

Código
  1. Array.Resize(ref buffer, rec);

y así evito leer la entrada de la tecla intro al leer. Gracias por la ayuda compañeros. Saludos!  ;)