[Ayuda] C# Recibir y enviar paquetes,conexion entre Servidor y cliente AS2 o SWF

Iniciado por Xx-Zerooh-xX, 19 Enero 2015, 15:11 PM

0 Miembros y 1 Visitante están viendo este tema.

Xx-Zerooh-xX

Hola, me gustaria que me hecharan una mano en esto, llevo 3 dias tratando con esto de los socket en c# lamentablemente google no me ha brindado mucha informacion.

Empece este emulador hace algunos dias, lo que quiero hacer es que múltiples clientes se conecten al servidor, encontré como hacerlo buscando y buscando por google.

Con este codigo, el servidor escucha al cliente, ya lo probé y el cliente que esta hecho en adobe flash, al ingresar los datos del login queda esperando a recibir una respuesta y si cierro el emulador, en el cliente aparece "Conexion interrumpida con el servidor" ¿Quieres volver a intentar conectarte al juego?.

Con un Sniffer o husmeador de trafico de red, Analice los paquetes que se envian, y son dos paquetes : "[Af][DatosDeLaCuenta]" y [Ax][NoRecuerdoDeQueEraXD] pero el que importa es el AF.

Lo que quiero lograr es que el emulador analice si se recibe el paquete AF y envie el paquete [AlEc][DarAccesoALaCuentaIngresada] y lograr pasar de la pantalla login.

Aqui les dejo el codigo que escucha al cliente, me falta el para analizar y me gustaria que me enseñaran como hacer lo que les pido, Muchas Gracias. Cualquier cosa comenten por favor.
Código (csharp) [Seleccionar]

public class GestorEntrada
   {
       //En estas variables esta almacenado los datos del servidor que pregunta a un archivo de texto cual es la ip y el puerto de entrada
       public static string IP = Ajustes.IP_SERVIDOR;
       public static int Puerto = Ajustes.RealmPort;

       public static IPAddress ipAddress = Dns.GetHostEntry(IP).AddressList[0];
       public static IPEndPoint localEndPoint = new IPEndPoint(ipAddress, Puerto);
       public static Socket listener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

       public static void EscucharCliente()
       {

           // Crear un TCP/IP socket.

           // Enlazando el socket a el punto de encuentro y escuchar las conexiones entrantes
           listener.Bind(localEndPoint);
           listener.Listen(100);

           
           ColorConsola.Info("Esperando conexiones entrantes...");

           
       }
}

.::IT::.

Ummm espero que esto de ayude para comenzar yo usaria un TcpListener en lugar de socket, yo usaria 2 clases una que es la que escucha en determinado puerto(Servidor.cs), y otra que procesa(Procesar.cs).
El funcionamiento seria :
1-. Servidor inicia un TcpListener en un determinado puerto y esta a la escucha de las peticiones del cliente usando el metodo "AcceptTcpClient()".
2-. Recibe la peticon del cliente y crea una instancia de la clase Procesar(new Procesar(datoscliente)) que tiene como parametro un odjecto TcpClient(el que es creado usando AcceptTcpClient()).
3-.Teniendo mi objeto "Procesar" creo un nuevo Thread(proceso) en el cual invoco a un metodo al que llamaria "process"
4.-Otra ves llamo a AcceptTcpClient().

Lo que lo hace multiusuario es que cada peticon se procesa en un Thread diferente eso es todo aqui un ejemplo:

Servidor.cs(Escrito directamente aqui en la ventana de posteo no se si compile pero te dara una idea)

Código (csharp) [Seleccionar]

public class Servidor
{
      private int puerto = 8069; //El puerto en el que corre
      TcpListener listener;
     
      public void listen()
      {
          listener = new TcpListener(IPAndress.Any,puerto);
          listener.Start();
           
          //Comiensa el ciclo repetitivo para aceptar peticiones
          while(true)
         {
              TcpClient s = listener.AcceptTcpClient();//En este punto el programa esta detenido esperando al cliente
              Procesar p = new Procesar(s);//Aqui ya recibi una peticion
              Thread t = new Thread(new ThreadStart(p.process)); // aqui la proceso en un nuevo Thread
             t.Start();//Listo es todo nuevamente regresa a s = listener.AcceptTcpClient(); y se repite el proceso
         }
      }
}


Aqui el codigo de la clase Procesar.cs

Código (csharp) [Seleccionar]
public class Procesar()
{
       TcpClient c;
       Stream input;//para leer los datos del cliente
       StreamWriter output;//para escribir la respuesta
       
       public Procesar(TcpClient socket)
       {
             this.c= socket;
       }
       
       public void process()
      {
             input = new BufferedStream(c.GetStream());
             output = new StreamWriter(new BufferedStream(c.GetStream()));
             //Aqui el codigo para procesar input
             //la respuesta la enviamos escribiendo en  output usando Write o WriteLine
             
             output.Flush();//invocamos al metodo Flush del output
             c.close();//cerramos el TcpClient
      }
}


Bueno esa es la extructura basica con la que yo trabajaria aunque e visto otras formas pero que no me convecieron mucho.

Por ultimo usamos nuestra clase servidor en nuestro metodo principal con

Servidor myServer=new Servidor()
myServer.Start();

Simplemente .::IT::.