Sockets en c

903 views

Published on

0 Comments
0 Likes
Statistics
Notes
  • Be the first to comment

  • Be the first to like this

No Downloads
Views
Total views
903
On SlideShare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
12
Comments
0
Likes
0
Embeds 0
No embeds

No notes for slide

Sockets en c

  1. 1. UNIVERSIDAD CATOLICA DE CUENCA EXT. CAÑAR Programación ii FACULTAD: ING. DE SISTEMAS Catedrático: ING. JHOVANNY SANTACRUZ. ALUMNA:MARCELA C. PADRÓN SAETEROS CURSO: SEGUNDO AÑO LECTIVO: 2010 – 2011
  2. 2. Sockets en C#IntroducciónEn este tutorial voy a explicar como trabajar con sockets en C#, este tutorial puedeservir tanto para C# como para VB, aunque lo centrare en C#. Recuerden queexportar 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 crearnosuno, pasaremos por un ejemplo de aplicación Cliente-Servidor hasta llegar a unejemplo en el que con nuestra aplicacion haremos una peticion a una pagina webpara que nos mande su Index.html (que es lo que hacen los navegadores).Bueno, por ultimo apuntar que trabajaremos en modo consola, queaprticularmente me gusta más.Ahora si, ya podemos empezar con lo que verdaderamente es el tutorial.¿Qué es un socket?Socket designa un concepto abstracto por el cual dos programas (posiblementesituados en computadoras distintas) pueden intercambiarse cualquier flujo dedatos, generalmente de manera fiable y ordenada.Un socket queda definido por una dirección IP, un protocolo y un número depuerto.Es decir, es un metodo para que aplicaciones situadas en disdintos ordenadores(o no, pueden comunicarse perfectametne aplicaciones situadas en el mismoordenador) puedan comunicarse. Para ello, se necesita la IP, un Puerto y unProtocolo. Nosotros utilizaremos el protocolo TCP.Basicamente al socket le pasaremos la IP a conectar, el puerto aconectar/escuchar y el protocolo, aparte de otras cosas, pero lo importante es eso.Teoria sobre Sockets en C#Este apartado es un "pasos previos" para hacer la aplicacion del siguientecapitulo.Para inidicar que queremos trabajar con sockets, tenemos que agregar lasiguientes lineas en el Using:Código:using System.Net;usingSystem.Net.Sockets;
  3. 3. Asi le indicamos que trabajaramos con sockets.Para conseguir la direccion del IP se usa el IPAddress, un ejemplo y luego loexplico:Código:IPAddressdirec = Dns.GetHostEntry("localhost").AddressList[0];Lo que se hace aqui es poner dentro de direc la IP de localhost, eso no se guardani en int ni en long ni en string, se guarda en IPAddress, para luego usarse en lasiguiente instrucción:Código:IPEndPointEp = new IPEndPoint(direccion, puerto);NOTA: Aunque se trabaje con numeros, esos numeros de la IP se tienen quepasar a IPAddress, ya que como int no lo va a tomar.Donde direccion es lo que habiamos conseguido antes con IPAddress, y en puertole ponemos un int que queramos, por ejemplo:Código:IPEndPointEp = new IPEndPoint(direc, 12345);Lo siguiente es crear el socket con lo obtenido hasta ahora. Lo llamaremosasi:Código: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ónsobre estos consultad la informacion que les da el entorno de programación.ProtocolType.Tcp: Es el potocolo que se usara, tambien hay vario, paramasinformacion 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. 4. Programando una aplicacion Cliente-ServidorCon lo de capitulo anterior agregado a nuestra futura aplicación, ya estamos listospara empezar a explicar todo lo que falta.En este capitulo programaremos un servidor, con el cual nos conectaremos con elNetCat para comunicarnos con nuestra aplicación.Al codigo que teniamos antes le agregamos estas lineas:Código: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 Listenestablece la longitud máxima de la cola de conexiones pendientes que puedetener el servidor antes de empezar a rechazar conexiones.La siguiente linea a agregar es la siguiente:Código:Socket handler = socket.Accept();Esta linea indica que el servidor queda esperando una llamada para leugoaceptarla.Eso era la principal parte a explicar, ahora les pegare un codigo explicado de laaplicación que e echo:Código:byte[] bytes = new byte[1024]; //Declaramos un array de bytes de longitud 1024intcount;String data = ""; //Declaramos data, que sera donde se almacenaran los datosdo //Bucle Do/While{ count = handler.Receive(bytes); //Recibimos los datos enviados y loguardamos en cout. data = System.Text.Encoding.ASCII.GetString(bytes, 0, count); //Locodificamos a cadena (ya que se envian como bytes) if (data != "exitn") //Mientras lo recibido no sea exit + n (es decir, exit +Intro, ya que introtambien se envia) {
  5. 5. Console.Write("Se a recibido: {0}", data); //Mostramos lo recibido propantalla } } while (data != "exitn"); //Mientras lo recibido no sea exit + Intro se continuael bucle, si recibimos exit + intro, salimos del bucle Console.WriteLine("Se ha finalizado la conexión"); //Avisamos qde que se aterminado la transferencia de datos byte[] msg = System.Text.Encoding.ASCII.GetBytes("nnFinalizadaconexioncon la aplicacion"); //Codificamos de string a byte el siguiente mensage para quese pueda enviar al NetCat (Cliente) handler.Send(msg); //Enviamos el mensage al cliente handler.Shutdown(SocketShutdown.Both); //"Apagamos" los sockets handler.Close(); //Los cerramosImplementación del protocolo HTTP en C# mediante SocketsEn este capítulo implementaremos un Cliente, el cual va a pedir a una pagina webque le transfiera el index de su pagina. Les pondre todo el codigo de mi Clientecomentado.Código:using System;usingSystem.Collections.Generic;usingSystem.Text;using System.Net;usingSystem.Net.Sockets;using System.IO;namespace ConsoleApplication2{ class Program { static void Main(string[] args) { string cabecera = "GET /index.html HTTP/1.0nn"; //Cabecera para hacerlapeticion del index. string respuesta; Byte[] SendBytes = Encoding.ASCII.GetBytes(cabecera); Byte[] RecvBytes = new Byte[255]; int bytes; boolsemaforo;
  6. 6. string html = ""; int e; semaforo = false; IPHostEntry address = Dns.GetHostEntry("www.web.com"); IPEndPointEp = 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 larespuesta 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
  7. 7. { html += respuesta; } } string fileName = "C:index.html"; //Guardamos lo recibido enC:Index.html StreamWriter writer = File.CreateText(fileName); writer.WriteLine(html); writer.Close(); Console.WriteLine("Archivoguardado con exito"); Console.Read(); } catch (Exception error) //Si durante el procedimiento hay error saltaaqui. { Console.WriteLine("Se produció el siguiente error: " + error); Console.Read(); } } }}

×