[Tutorial] Sockets en C#

C#, tambien llamado C Sharp

Moderador: raul338

[Tutorial] Sockets en C#

Notapor Vicitor2006 » Jue Ene 03, 2008 2:38 pm

Sockets en C#


Index:

    Introducción
    ¿Qué es un Socket?
    Teoria sobre Sockets en C#
    Programando una aplicacion Cliente-Servidor
    Implementación del protocolo HTTP en C# mediante Sockets
    Despedida




1. Introducción

En este tutorial voy a explicar como trabajar con sockets en C#, este tutorial puede servir tanto para C# como para VB, aunque lo centrare en C#. Recuerden que exportar un codigo en C# a otro en VB no es tan complicado.

A lo largo de este tutorial veremos que significa la palabra socket y como crearnos uno, pasaremos por un ejemplo de aplicación Cliente-Servidor hasta llegar a un ejemplo en el que con nuestra aplicacion haremos una peticion a una pagina web para que nos mande su Index.html (que es lo que hacen los navegadores).

Bueno, por ultimo apuntar que trabajaremos en modo consola, que prticularmente me gusta más.

Ahora si, ya podemos empezar con lo que verdaderamente es el tutorial.



2. ¿Qué es un socket?

Para responder a esta pregunta, podemos consultar perfectamente la wikipedia, que siempre es de gran ayuda.

Cita de la Wikipedia:

Socket designa un concepto abstracto por el cual dos programas (posiblemente situados en computadoras distintas) pueden intercambiarse cualquier flujo de datos, generalmente de manera fiable y ordenada.

Un socket queda definido por una dirección IP, un protocolo y un número de puerto.


Es decir, es un metodo para que aplicaciones situadas en disdintos ordenadores (o no, pueden comunicarse perfectametne aplicaciones situadas en el mismo ordenador) puedan comunicarse. Para ello, se necesita la IP, un Puerto y un Protocolo. Nosotros utilizaremos el protocolo TCP.

Basicamente al socket le pasaremos la IP a conectar, el puerto a conectar/escuchar y el protocolo, aparte de otras cosas, pero lo importante es eso.



3. Teoria sobre Sockets en C#

Este apartado es un "pasos previos" para hacer la aplicacion del siguiente capitulo.

Para inidicar que queremos trabajar con sockets, tenemos que agregar la siguientes lineas en el Using:

Código:
using System.Net;
using System.Net.Sockets;

Asi le indicamos que trabajaramos con sockets.

Para conseguir la direccion del IP se usa el IPAddress, un ejemplo y luego lo explico:

Código: Seleccionar todo
IPAddress direc = Dns.GetHostEntry("localhost").AddressList[0];


Lo que se hace aqui es poner dentro de direc la IP de localhost, eso no se guarda ni en int ni en long ni en string, se guarda en IPAddress, para luego usarse en la siguiente instrucción:

Código: Seleccionar todo
IPEndPoint Ep = new IPEndPoint(direccion, puerto);


NOTA: Aunque se trabaje con numeros, esos numeros de la IP se tienen que pasar a IPAddress, ya que como int no lo va a tomar.

Donde direccion es lo que habiamos conseguido antes con IPAddress, y en puerto le ponemos un int que queramos, por ejemplo:

Código: Seleccionar todo
IPEndPoint Ep = new IPEndPoint(direc, 12345);


Lo siguiente es crear el socket con lo obtenido hasta ahora. Lo llamaremos asi:

Código: Seleccionar todo
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);


Dividamoslo por agrumentos:

AddressFamily.InterNetwork: Esto indica que la direccion es para una IP v4 (xxx.xxx.xxx.xxx)

SocketType.Stream: Es el tipo de socket, hay varios tipos, para mas información sobre estos consultad la informacion que les da el entorno de programación.

ProtocolType.Tcp: Es el potocolo que se usara, tambien hay vario, para mas informacion consulten el entorno de programación.

Bien, una vez echo esto ya tenemos el socket apunto para ser usado. Para usarlo, vamonos directamente a la practica, es decir, al punto siguiente.



4. Programando una aplicacion Cliente-Servidor

Con lo de capitulo anterior agregado a nuestra futura aplicación, ya estamos listos para empezar a explicar todo lo que falta.

En este capitulo programaremos un servidor, con el cual nos conectaremos con el NetCat para comunicarnos con nuestra aplicación.

Al codigo que teniamos antes le agregamos estas lineas:

Código: Seleccionar todo
socket.Bind(Ep);
socket.Listen(100);


Lo que hacemos aqui es proceder a escuchar por el puerto descrito en Ep (recuerden que era el 12345). Luego en la siguiente linea, el parametro de Listen establece la longitud máxima de la cola de conexiones pendientes que puede tener el servidor antes de empezar a rechazar conexiones.

La siguiente linea a agregar es la siguiente:

Código: Seleccionar todo
Socket handler = socket.Accept();


Esta linea indica que el servidor queda esperando una llamada para leugo aceptarla.

Eso era la principal parte a explicar, ahora les pegare un codigo explicado de la aplicación que e echo:

Código: Seleccionar todo
byte[] bytes = new byte[1024]; //Declaramos un array de bytes de longitud 1024
int count;
String data = ""; //Declaramos data, que sera donde se almacenaran los datos

do //Bucle Do/While
   {
           count = handler.Receive(bytes); //Recibimos los datos enviados y lo guardamos en cout.
                data = System.Text.Encoding.ASCII.GetString(bytes, 0, count); //Lo codificamos a cadena (ya que se envian como bytes)
                if (data != "exit\n") //Mientras lo recibido no sea exit + \n (es decir, exit + Intro, ya que intro tambien se envia)
                {
                    Console.Write("Se a recibido: {0}", data); //Mostramos lo recibido pro pantalla
                }


        } while (data != "exit\n");  //Mientras lo recibido no sea exit + Intro se continua el bucle, si recibimos exit + intro, salimos del bucle

        Console.WriteLine("Se ha finalizado la conexión"); //Avisamos qde que se a terminado la transferencia de datos

        byte[] msg = System.Text.Encoding.ASCII.GetBytes("\n\nFinalizada conexion con la aplicacion"); //Codificamos de string a byte el siguiente mensage para que se pueda enviar al NetCat (Cliente)

        handler.Send(msg); //Enviamos el mensage al cliente
        handler.Shutdown(SocketShutdown.Both); //"Apagamos" los sockets
        handler.Close(); //Los cerramos




5. Implementación del protocolo HTTP en C# mediante Sockets

En este capítulo implementaremos un Cliente, el cual va a pedir a una pagina web que le transfiera el index de su pagina. Les pondre todo el codigo de mi Cliente comentado.

Código: Seleccionar todo
using System;
using System.Collections.Generic;
using System.Text;
using System.Net;
using System.Net.Sockets;
using System.IO;

namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            string cabecera = "GET /index.html HTTP/1.0\n\n"; //Cabecera para hacer la peticion del index.
            string respuesta;
            Byte[] SendBytes = Encoding.ASCII.GetBytes(cabecera);
            Byte[] RecvBytes = new Byte[255];
            int bytes;
            bool semaforo;
            string html = "";
            int e;

            semaforo = false;

            IPHostEntry address = Dns.GetHostEntry("www.web.com");

            IPEndPoint Ep = new IPEndPoint(address.AddressList[0], 80);

            Socket socket = new Socket(AddressFamily.InterNetwork,
                                         SocketType.Stream,
                                         ProtocolType.Tcp);

            try
            {

                socket.Connect(Ep); //Conectamos

                socket.Send(SendBytes,SendBytes.Length,SocketFlags.None); //Enviamos la cabecera

                bytes = socket.Receive(RecvBytes,RecvBytes.Length,SocketFlags.None); //Recibimos la respuesta en bloques de 255 bytes

                respuesta = Encoding.ASCII.GetString(RecvBytes, 0, bytes); //Codificamos la respuesta

                while (bytes > 0)
                {

                    bytes = socket.Receive(RecvBytes,
                                             RecvBytes.Length,
                                             SocketFlags.None);

                    respuesta = Encoding.ASCII.GetString(RecvBytes, 0, bytes);

                    if (semaforo == false) //Filtro de encabezamientos
                    {
                        e = respuesta.IndexOf("<html>");
                        if (e != -1)
                        {
                            semaforo = true;
                            html = respuesta.Substring(e);
                        }
                    }
                    else
                    {
                        html += respuesta;
                    }

                }

                string fileName = "C:\\index.html"; //Guardamos lo recibido en C:\Index.html
                StreamWriter writer = File.CreateText(fileName);

                writer.WriteLine(html);
                writer.Close();

                Console.WriteLine("Archivo guardado con exito");
                Console.Read();

            }
            catch (Exception error) //Si durante el procedimiento hay error salta aqui.
            {
                Console.WriteLine("Se produció el siguiente error: " + error);
                Console.Read();
            }
        }
    }
}




6. Despedida

Bueno, hasta aqui llego este tutorial de Sockets en C#, la verdad es que son bastante faciles de manejar y son bastante completos.

Este documento lo e echo basandome en algunos textos de internet y obviamente segun mi experiencia con sokets.

Un Saludo.


Documento bajo licencia CopyLeft

Fuente:
http://foro.elhacker.net/index.php/topic,165986.0.html
Estoy aki para aprender
Imagen
Avatar de Usuario
Vicitor2006
Usuario Muy Activo
Usuario Muy Activo
 
Mensajes: 127
Registrado: Mié May 23, 2007 11:38 am

Re: [Tutorial] Sockets en C#

Notapor waltico » Mar Ene 29, 2008 9:30 pm

Gracias por compartir la informacion. :D
Avatar de Usuario
waltico
Colaborador
Colaborador
 
Mensajes: 183
Registrado: Sab Jun 21, 2003 4:04 pm
Ubicación: Puno


Volver a C#

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 1 invitado

cron