Ir a contenido


MENSAJE DE BIENVENIDA Foro vínculado con Twitter, más info aquí.

“El secreto para progresar es empezar por algún lugar. El secreto para empezar por algún lugar es fragmentar tus complejas y abrumadoras tareas de tal manera que queden convertidas en pequeñas tareas que puedas realizar y entonces simplemente comenzar por la primera.” - Mark Twain

Foto

Multiplexando Sockets


  • Please log in to reply
No replies to this topic

#1 Alberto Dominguez

Alberto Dominguez

    Gurú

  • Administradores
  • 1.059 Mensajes:
  • LocationMadrid

Escrito 19 agosto 2010 - 16:09

Como muchos sabréis para abrir canales de comunicaciones usamos Sockets.
Los manejamos en C# con varias clases (TcpListener, TcpClient, Socket, etc.)
A grandes rasgos lo que hacemos es que abrimos un canal de comunicación desde una IP y un puerto hacia otra IP y un puerto.

El caso es que en ocasiones podemos necesitar abrir varios hilos de comunicaciones en un mismo puerto. Imaginemos por ejemplo que somos un Servidor SMTP...

Os dejo aquí un código sencillo y muy básico que ilustra por donde hincarle el diente al tema. Se trata de un servidor escuchando en el puerto 8080:

Lo primero, nos creamos una clase Protocolo con un método llamado ManejarConexion, que será al que llamarán los hilos y será el encargado de llevar a cabo el protocolo de comunicación que establezcamos en cada una de las conexiones:

using System;
using System.Text;
using System.Net.Sockets;
using System.Threading;

namespace ServerThreads
{
    class Protocolo 
    {
        public const int BUFSIZE = 32;

        private Socket _conexion;

        public Protocolo(Socket conexion)  // Constructor al que se le pasa una conexion
        {
            _conexion = conexion;
        }

        public void ManejarConexion()    // Método al que llamarán los Hilos
        {
            byte[] bufferRecepcion = new byte[BUFSIZE];
            int bytesRecibidos;
            int totalBytesRecibidos = 0;
            while ((bytesRecibidos = _conexion.Receive(bufferRecepcion, 0, bufferRecepcion.Length, SocketFlags.None)) > 0)
            {
                Console.Write(Encoding.ASCII.GetString(bufferRecepcion, 0, bytesRecibidos));  //Escribe carácter recibido en pantalla.
                totalBytesRecibidos += bytesRecibidos;
            }
            Console.WriteLine("Bytes Recibidos: {0}", totalBytesRecibidos);
            _conexion.Close();
        }
    }
}

Y luego multiplexamos creando un hilo cada vez que se establece una conexión:

using System;
using System.Net;
using System.Net.Sockets;
using System.Threading;

namespace ServerThreads
{
    public class TCPServidor
    {
        static void Main(string[] args)
        {
            int puertoServidor = 8080;
            TcpListener servidor = new TcpListener(IPAddress.Any, puertoServidor);
            servidor.Start(); // Iniciamos...
            for (; ; )  // Permanentemente a la escucha...
            {
                Socket conexion = servidor.AcceptSocket();  // En espera hasta conexión
                Protocolo protocoloConexion = new Protocolo(conexion);
                Thread hilo = new Thread(new ThreadStart(protocoloConexion.ManejarConexion));
                hilo.Start();
            }
        }
    }
}

Podéis probar el código con simples telnets al puerto 8080 (telnet localhost 8080), veréis como cada conexión se gestiona en un hilo o subproceso independiente. Nuestro protocolo en este caso es muy simple, dado que lo único que hace es escribir lo que recibe por pantalla, pero lógicamente podríamos definir el protocolo que queramos.
Saludos,

Alberto Dominguez

Enterprise Architect y Trainer
MCT, MCPD, MCITP, MCITP Dynamics, MCSE, MCSA, MCTS, MCP...
ITIL V3 Foundation Qualification in IT Service Management
Imagen enviadaPerfil Profesional Imagen enviadaTwitter
Imagen enviadaImagen enviadaImagen enviadaImagen enviada




0 usuarios están leyendo este tema

0 miembro/s, 0 invitado/s, 0 usuario/s anónimo/s