SlideShare uma empresa Scribd logo
1 de 7
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
Sockets en C#


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
aprticularmente 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 (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.

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;
usingSystem.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:
IPAddressdirec = 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:
IPEndPointEp = 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:
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ó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
masinformacion 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.
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:
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:
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:
byte[] bytes = new byte[1024]; //Declaramos un array de bytes de longitud 1024
intcount;
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 != "exitn") //Mientras lo recibido no sea exit + n (es decir, exit +
Intro,           ya            que            introtambien           se            envia)
                                                                                         {
Console.Write("Se a recibido: {0}", data); //Mostramos lo recibido pro
pantalla
                                                                                      }


     } while (data != "exitn"); //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("nnFinalizadaconexion
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


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:
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 hacer
lapeticion del index.
         string respuesta;
         Byte[] SendBytes = Encoding.ASCII.GetBytes(cabecera);
         Byte[] RecvBytes = new Byte[255];
         int bytes;
         boolsemaforo;
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 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("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();
            }
        }
    }
}

Mais conteúdo relacionado

Mais procurados (15)

PEP-3156: Async I/O en Python
PEP-3156: Async I/O en PythonPEP-3156: Async I/O en Python
PEP-3156: Async I/O en Python
 
Objeto Connection
Objeto ConnectionObjeto Connection
Objeto Connection
 
Programacion en sockets informe
Programacion en sockets informeProgramacion en sockets informe
Programacion en sockets informe
 
Sockets TCP
Sockets TCPSockets TCP
Sockets TCP
 
Encriptación
EncriptaciónEncriptación
Encriptación
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Sockets UDP
Sockets UDPSockets UDP
Sockets UDP
 
Socket
SocketSocket
Socket
 
El servidor
El servidorEl servidor
El servidor
 
Postfix
PostfixPostfix
Postfix
 
Sockets en JAVA
Sockets en JAVASockets en JAVA
Sockets en JAVA
 
Ejemplosencillocon rmi
Ejemplosencillocon rmiEjemplosencillocon rmi
Ejemplosencillocon rmi
 
Turbo pascal 7 guia principal
Turbo pascal 7 guia principalTurbo pascal 7 guia principal
Turbo pascal 7 guia principal
 
PROGRAMACIÓN PARALELA
PROGRAMACIÓN PARALELAPROGRAMACIÓN PARALELA
PROGRAMACIÓN PARALELA
 
Ejemplo Java Rmi
Ejemplo Java RmiEjemplo Java Rmi
Ejemplo Java Rmi
 

Semelhante a Sockets en c

Lw2010 Pedro Valera
Lw2010 Pedro ValeraLw2010 Pedro Valera
Lw2010 Pedro Valeraguestf280e2
 
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En RedesLw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redesguest5d7f33c
 
Desarrollo aplicaciones distribuidas sockets
Desarrollo aplicaciones distribuidas socketsDesarrollo aplicaciones distribuidas sockets
Desarrollo aplicaciones distribuidas socketsdandark2000
 
Sockets en delphi
Sockets en delphiSockets en delphi
Sockets en delphijairoj2012
 
Scapy. Generación y manipulación básica de paquetes de red
Scapy. Generación y manipulación básica de paquetes de redScapy. Generación y manipulación básica de paquetes de red
Scapy. Generación y manipulación básica de paquetes de redDavid Cristóbal
 
Programacionclienteservidor
ProgramacionclienteservidorProgramacionclienteservidor
Programacionclienteservidorwilmercampos4
 
Sockets En Python Por Antoni Luque Delgado
Sockets En Python Por Antoni Luque DelgadoSockets En Python Por Antoni Luque Delgado
Sockets En Python Por Antoni Luque Delgadomephistodark
 
Sistema de Mensajeria de Colas con ZeroMQ y Python
Sistema de Mensajeria de Colas con ZeroMQ y PythonSistema de Mensajeria de Colas con ZeroMQ y Python
Sistema de Mensajeria de Colas con ZeroMQ y PythonErnesto Crespo
 
Sistemas operativos distribuidos ii
Sistemas operativos distribuidos iiSistemas operativos distribuidos ii
Sistemas operativos distribuidos iiMiguel Hernandez
 
Ejemplo de RPC (Servidor de Archivos) enviar archivo en Java utilizando RPC
Ejemplo de RPC (Servidor de Archivos) enviar archivo en Java utilizando RPCEjemplo de RPC (Servidor de Archivos) enviar archivo en Java utilizando RPC
Ejemplo de RPC (Servidor de Archivos) enviar archivo en Java utilizando RPCIvan Luis Jimenez
 
Programación web con JSP
Programación web con JSPProgramación web con JSP
Programación web con JSPousli07
 
Instalacion servicio e-mail Linux Mint
Instalacion servicio e-mail Linux MintInstalacion servicio e-mail Linux Mint
Instalacion servicio e-mail Linux MintGer Hernandez
 

Semelhante a Sockets en c (20)

Ejemplo de aplicación cliente-servidor en C#
Ejemplo de aplicación cliente-servidor  en C#Ejemplo de aplicación cliente-servidor  en C#
Ejemplo de aplicación cliente-servidor en C#
 
Lw2010 Pedro Valera
Lw2010 Pedro ValeraLw2010 Pedro Valera
Lw2010 Pedro Valera
 
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En RedesLw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
Lw2010 - Uso De La Programacion En Linux Para La Seguridad En Redes
 
Desarrollo aplicaciones distribuidas sockets
Desarrollo aplicaciones distribuidas socketsDesarrollo aplicaciones distribuidas sockets
Desarrollo aplicaciones distribuidas sockets
 
Sockets en delphi
Sockets en delphiSockets en delphi
Sockets en delphi
 
Scapy. Generación y manipulación básica de paquetes de red
Scapy. Generación y manipulación básica de paquetes de redScapy. Generación y manipulación básica de paquetes de red
Scapy. Generación y manipulación básica de paquetes de red
 
Networking
NetworkingNetworking
Networking
 
Programacionclienteservidor
ProgramacionclienteservidorProgramacionclienteservidor
Programacionclienteservidor
 
Sockets En Python Por Antoni Luque Delgado
Sockets En Python Por Antoni Luque DelgadoSockets En Python Por Antoni Luque Delgado
Sockets En Python Por Antoni Luque Delgado
 
Sockets
SocketsSockets
Sockets
 
Sistema de Mensajeria de Colas con ZeroMQ y Python
Sistema de Mensajeria de Colas con ZeroMQ y PythonSistema de Mensajeria de Colas con ZeroMQ y Python
Sistema de Mensajeria de Colas con ZeroMQ y Python
 
Sistemas operativos distribuidos ii
Sistemas operativos distribuidos iiSistemas operativos distribuidos ii
Sistemas operativos distribuidos ii
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Tema servlets
Tema servletsTema servlets
Tema servlets
 
Aplicación Cliente - Servidor / GUI - Consola
Aplicación Cliente - Servidor / GUI - ConsolaAplicación Cliente - Servidor / GUI - Consola
Aplicación Cliente - Servidor / GUI - Consola
 
Ejemplo de RPC (Servidor de Archivos) enviar archivo en Java utilizando RPC
Ejemplo de RPC (Servidor de Archivos) enviar archivo en Java utilizando RPCEjemplo de RPC (Servidor de Archivos) enviar archivo en Java utilizando RPC
Ejemplo de RPC (Servidor de Archivos) enviar archivo en Java utilizando RPC
 
Programación web con JSP
Programación web con JSPProgramación web con JSP
Programación web con JSP
 
Instalacion servicio e-mail Linux Mint
Instalacion servicio e-mail Linux MintInstalacion servicio e-mail Linux Mint
Instalacion servicio e-mail Linux Mint
 
Comunicaciones serialesc#2010 ccs
Comunicaciones serialesc#2010 ccsComunicaciones serialesc#2010 ccs
Comunicaciones serialesc#2010 ccs
 

Sockets en c

  • 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. Sockets en C# 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 aprticularmente 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 (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. 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; usingSystem.Net.Sockets;
  • 3. 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: IPAddressdirec = 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: IPEndPointEp = 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: 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ó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 masinformacion 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: 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: 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: byte[] bytes = new byte[1024]; //Declaramos un array de bytes de longitud 1024 intcount; 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 != "exitn") //Mientras lo recibido no sea exit + n (es decir, exit + Intro, ya que introtambien se envia) {
  • 5. Console.Write("Se a recibido: {0}", data); //Mostramos lo recibido pro pantalla } } while (data != "exitn"); //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("nnFinalizadaconexion 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 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: 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 hacer lapeticion del index. string respuesta; Byte[] SendBytes = Encoding.ASCII.GetBytes(cabecera); Byte[] RecvBytes = new Byte[255]; int bytes; boolsemaforo;
  • 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 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
  • 7. { 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("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(); } } } }