sockets

Upload: benjamin-sanchez

Post on 06-Jul-2015

1.180 views

Category:

Documents


0 download

TRANSCRIPT

Programacin con SocketsDpto. Lenguajes y Ciencias de la Computacin rea de Ingeniera Telemtica

Universidad de Mlaga

ContenidosEl modelo cliente/servidor Sockets Programacin avanzada con sockets Bibliografa

Programacin con Sockets

2

El modelo cliente/servidorIntroduccin Definicin Ventajas Servidores y serviciosServidores sin estado Servidores con estado

Programacin con Sockets

3

IntroduccinCarencia de los modelos de referencia OSI y TCP/IPNo sugieren cmo estructurar u organizar las aplicaciones que se ejecutan sobre las redes

Modelo cliente/servidorEstablece que una aplicacin distribuida se compone de dos tipos de elementos: servidores y clientesProgramacin con Sockets

4

DefinicinModelo cliente/servidorUn servidor es una entidad (computador, proceso, procedimiento) que ofrece una serie de servicios Un cliente en una entidad que solicita los servicios de un servidor Una entidad puede ser a su vez cliente y servidorProgramacin con Sockets

5

DefinicinCliente 1 Servidor de impresin Impresoras

Cliente 2

Cliente 3

Programacin con Sockets

6

VentajasVentajas del modelo cliente/servidorAbstraccin: en primer lugar se presta atencin a los servicios que se ofrecen, no a cmo se implementan Simplicidad: los servidores son relativamente simples Cdigo ms estructuradoLos clientes se comunican con los servidores usando un simple protocolo de peticin/respuesta1. Solicitud

ClienteProgramacin con Sockets

2. Respuesta

Servidor

7

ServidoresTipos de servidoresServidores iterativosSe basan en el algoritmo bsico Slo pueden atender una peticin a la vez

Servidores concurrentesMs complejos Pueden atender ms de una peticin a la vez

Programacin con Sockets

8

Tipos de serviciosTipos de serviciosOrientados a la conexinLos clientes establecen una conexin con el servidor, solicitan los servicios y cierran la conexin

No orientados a la conexinLos clientes solicitan los servicios de forma independiente unos de otros

Programacin con Sockets

9

Tipos de serviciosTipos de serviciosCon estado (stateful)Tpico de servicios orientados a la conexin El servidor mantiene informacin de los clientes entre sucesivas invocaciones de los servicios por parte de ellos

Sin estado (stateless)El servidor no mantiene ninguna informacin entre invocaciones sucesivas de un mismo clienteProgramacin con Sockets

10

Servidores sin estadoServidores sin estado (stateless)Tolerancia a fallos No requieren llamadas para establecer y cerrar conexiones No se desperdicia memoria en tablas No existe lmite para el nmero de conexiones abiertas a la vez No se producen problemas si cae un clienteProgramacin con Sockets

11

Servidores con estadoServidores con estado (stateful)Mensajes de solicitud de servicio ms cortos Mejor rendimiento En el caso de servidores de ficherosEs posible realizar operaciones de lectura anticipada Permiten el bloqueo de ficheros12

Programacin con Sockets

Tipos de servidoresCuatro tipos bsicos de servidoresIterativo sin conexin Concurrente sin conexin Iterativo orientado a la conexin Concurrente orientado a la conexin

Programacin con Sockets

13

ContenidosEl modelo cliente/servidor Sockets Programacin avanzada con sockets Bibliografa

Programacin con Sockets

14

FundamentosDefinicin Dominio de un socket Direccionamiento Tipos de sockets Primitivas Ejemplos Sockets en JavaProgramacin con Sockets

15

Fundamentos. DefinicinPunto de comunicacin por el que un proceso puede enviar o recibir informacinCanal de comunicacin bidireccional (full-duplex)

Se identifican con un descriptor similar al de ficheros La interfaz socket es una API (Application Programming Interface)Usa servicios de la capa de transporte (nivel 4) de la jerarqua OSI Es un estndar de factoProgramacin con Sockets

16

Fundamentos. Dominio de un socketEspecifica el formato de las direcciones y los protocolos que soportaAF_INET es la familia para TCP/IP

Estructura genrica de direccin de socketstruct socketaddr { u_short sa_family ; // familia: AF_XXX char sa_data[14] ; // direccin de socket } ;Programacin con Sockets

17

Fundamentos. DireccionamientoLos procesos acceden a TCP y UDP a travs de puertosproceso sobre UDP cliente

Servidor sobre TCP

cliente

proceso sobre UDP

proceso sobre UDP

Programacin con Sockets

18

Fundamentos. DireccionamientoLos Puertos se identifican por nmeros naturales La relacin de puertos con procesos se establece por el uso de funciones del S.O., entre ellas las de uso de sockets

Programacin con Sockets

19

Fundamentos. Direcciones de socketsLa direccin de un socket distingue unvocamente a un nodo Estructura para la familia AF_INETstruct socketaddr_in { u_short sin_family ; u_short sin_port ; u_long sin_addr ; char sin_zero[8] ; } ; // // // // familia AF_INET nmero del puerto direccin de Internet no usado

Programacin con Sockets

20

Fundamentos. Direcciones de socketssockaddrsa_len sa_len sa_family sa_family

sockaddr_insin_len sin_len AF_INET sin_port sin_addr

sa_data sa_data sin_zero

Programacin con Sockets

21

Fundamentos. ConversionesOrdenacin de bytesHost byte order (little-endian)Byte menos significativo primero

Network byte order (big-endian)Byte ms significativo primero

Todos los campos de socketaddr_in han de almacenarse en Network byte

order

Programacin con Sockets

22

Fundamentos. ConversionesLittle-EndianLow Byte Addr A High Byte Addr A+1

Big-EndianHigh Byte Addr A Low Byte Addr A+1

IBM 80x86 DEC VAX DEC PDP-11

IBM 370 Motorola 68000 SunProgramacin con Sockets

23

Fundamentos. Tipos de socketsSOCK_STREAMServicio orientado a la conexin: comunicaciones fiables (usa TCP)

SOCK_DGRAMServicio no orientado a la conexin: comunicaciones no fiables (usa UDP)

Programacin con Sockets

25

Fundamentos. Secuencia de operaciones TCPProceso Servidor socket( ) bind( ) listen( ) accept( ) read( ) write( )Programacin con Sockets

Proceso Cliente socket( )

connect( ) write( ) read( ) close( )26

Fundamentos. PrimitivasPrimitivas para operar con sockets TCPOperacin socket bind listen accept connect send, writeshutdown,close

Significado Crea un socket Vincula una direccin y un puerto al socket Se indica que se esperan conexiones Espera hasta que se establece una conexin Intenta establecer una conexin Enva datos Cierra la conexinProgramacin con Sockets

receive, read Recibe datos

27

Fundamentos. Secuencia de operaciones UDPProceso Servidor socket( ) bind( ) recvfrom() sendto( ) Proceso Cliente socket( ) bind( ) sendto( ) recvfrom() close( )

Programacin con Sockets

28

Fundamentos. PrimitivasPrimitivas para operar con sockets UDPOperacin sendto recvfrom Significado Envo de un datagrama Recepcin de un datagrama

+ socket, bind, close

Programacin con Sockets

29

Fundamentos. PrimitivasPrimitivas para obtener datos de redOperacin Significado gethostbyname Obtiene la una direccin remota de una mquina a partir de su nombre gethostbyaddr Obtiene la una direccin remota de una mquina a partir de su nombre

Programacin con Sockets

30

Fundamentos. Primitivas: socket()Primitiva socket()int s = socket(familia, tipo, protocolo) Familia de protocoloTCP/IP:

Programacin con Sockets

31

Fundamentos. Primitivas: bind()Primitiva bind()bind(descriptor, direccionLocal, longDireccion) DescripcinSe utiliza para vincular un puerto local (que se encuentra en direccionLocal) con la aplicacin, de forma que sta pueda aceptar conexiones de los clientes

DescriptorDescriptor de un socket abierto previamente

Direccin localLa sintaxis de la direccin local depende del protocoloProgramacin con Sockets

32

Fundamentos. Primitivas: listen()Primitiva listen()listen(descriptor, longitudDeLaCola) DescripcinPone el socket en modo pasivo, esperando conexiones de clientes

Longitud de la colaLongitud de la cola de solicitudes de clientes El valor mximo suele ser SOMAXCONN

Programacin con Sockets

33

Fundamentos. Primitivas: accept()Primitiva accept()nuevoDescriptor = accept(descriptor, direccion, longitudDireccion) DescripcinUn servidor acepta una conexin de un cliente El resultado es un nuevo socket con las mismas propiedades que descriptorEste nuevo socket lo devuelve el S.O. ya conectado al cliente, de forma que sobre l se permite el envo y recepcin de datos

Programacin con Sockets

34

Fundamentos. Primitivas: connect()Primitiva connect()connect(descriptor, direccion, longitudDireccion) DescripcinUn cliente establece una conexin con el servidor cuya direccin se pasa como segundo argumento

Programacin con Sockets

35

Fundamentos. Primitivas: envio de datosPrimitivas para envo orientado a conexinsend(descriptor, buffer, longitudBuffer, indicadores) write(descriptor, buffer, longitudBuffer) DescripcinEnvo de informacin a travs de una conexin TCP Requiere el descriptor de un socket donde enviar los datos, la direccin de los datos a ser enviados y la longitud de stos NOTA: El descriptor debe estar conectado: en el cliente, tras la llamada a connect(); en el servidor, ser el nuevo descriptor devuelto por accept()

Programacin con Sockets

36

Fundamentos. Primitivas: envio de datosPrimitivas para envo no orientado a conexinsendto(descriptor, buffer, logitudBuffer, direccinSocket, tamaoDireccinSocket) sendmsg(descriptor, mensaje, indicadores) DescripcinEnvo de informacin a travs de una conexin UDPNo fiable

Adems del mensaje a enviar, necesita la direccin de envo (IP y puerto remotos) ya que es un servicio sin conexin

Programacin con Sockets

37

Fundamentos. Primitivas: recepcin de datosPrimitivas para recepcin orientada a conexinrecv(descriptor, buffer, longitudBuffer, indicadores) read(descriptor, buffer, longitudBuffer) DescripcinRecepcin de informacin a travs de una conexin TCP Lee datos a travs del descriptor del socket y los almacena en el buffer de recepcin

NOTA: El descriptor debe estar conectado: en el cliente, tras la llamada a connect(); en el servidor, ser el nuevo descriptor devuelto por accept()Programacin con Sockets

38

Fundamentos. Primitivas: recepcin de datosPrimitivas para recepcin no orientada a conexinrecvfrom(descriptor, buffer, logitudBuffer, direccinSocket, tamaoDireccinSocket) recvmsg(descriptor, mensaje, indicadores) DescripcinRecepcin de informacin mediante una conexin UDPNo fiable

Adems del buffer de recepcin, se pasa por referencia la direccin y puerto remotos de donde viene el mensaje (ya que es un servicio sin conexin previa)

Programacin con Sockets

39

Fundamentos. Primitivas: cierre de conexinPrimitivas close() y shutdown()close(descriptor) DescripcinCierra un socket Libera los recursos asociados al mismo No se pueden realizar envos ni recepciones shutdown(descriptor,modo_cierre)

DescripcinCierra comunicaciones a nivel de transporte segn un modo: SHUT_RD: deshabilita lecturas, permite seguir escribiendo en el socket SHUT_WR: deshabilita escrituras, permite seguir leyendo del socket SHUT_RDWR: cierra la comunicacin en los dos sentidos

Nota: No libera los recursos del socket. Hay que llamar a close()Programacin con Sockets

40

Fundamentos. Primitivas: gethostbyname()Primitiva gethostbyname()gethostbyname(nombreDeHost)

DescripcinObtiene la direccin (en Network Byte Order) que corresponde a nombreDeHost

Programacin con Sockets

41

Fundamentos. Primitivas: gethostbyaddr()Primitiva gethostbyaddr()gethostbyaddr(cadenaDireccion, longitudDireccion, familia)

DescripcinObtiene la direccin (en Network Byte Order) apuntada por cadenaDireccion con longitud longitudDireccion

Programacin con Sockets

42

Ejemplo. Servidor de fechasLa aplicacin se compone de tres ficheros:servidor.c: cdigo del servidor cliente.c: cdigo de un cliente defs.h: fichero de cabecera, compartido por el cliente y por el servidor

Programacin con Sockets

43

Servidor de fechas. Fichero de cabecera/******************************************************************/ /* FICHERO: defs.h */ /* DESCRIPCION: fichero de cabecera para hacer uso de un servidor */ /* de fechas */ /* COMENTARIOS: version realizada sobre un sistema Linux */ /******************************************************************/ #ifndef __DEFS_H__ #define __DEFS_H__ #include #include #include #include #include const char direccion_ip[] = "130.114.128.10" ; const char puerto_tcp[] = "7010" ; #define SOLICITUD_FECHA #define RESPUESTA_FECHA 1 2/* Sigue -----------------> */

Programacin con Sockets

44

Servidor de fechas. Fichero de cabecera/* (1) */

Programacin con Sockets

46

Servidor de fechas. Servidor/* (2) */

Programacin con Sockets

47

Servidor de fechas. Servidor/* tm_mday ; fecha.mes = fechaPtr->tm_mon + 1 ; /* devuelve de 0 a 11 */ fecha.anno = fechaPtr->tm_year + 1900 ; /* dias desde 1900 */ fecha.hora = fechaPtr->tm_hour ; fecha.minuto = fechaPtr->tm_min ; fecha.segundo = fechaPtr->tm_sec ;/* Sigue -----------------> (3) */

Programacin con Sockets

48

Servidor de fechas. Servidor/* (1) */

Programacin con Sockets

50

Servidor de fechas. Cliente/* ") ; fprintf(stderr, "mensaje desconocido: %d\n", codigoOperacion) ; exit(-1) ; } /* else */ } /* main */

Programacin con Sockets

52

Servidor de fechas. Compilacin y ejecucinCompilacinServidor (Linux):gcc o servidor servidor.c

Cliente (Linux):gcc o cliente cliente.c

En Solaris:gcc -o servidor servidor.c -lnsl lsocket

EjecucinEjecutar en la mquina 130.114.128.10% ./servidor &

Ejecutar en cualquier otra mquina% ./clienteProgramacin con Sockets

53

Un ejemplo con UDP. Receptor/******************************************************************************/ /* FICHERO: receptorUDP.c */ /* DESCRIPCION: espera algn paquete en el puerto 4950 y muestra su contenido */ /* COMENTARIOS: version realizada sobre un sistema Linux */ /******************************************************************************/

#include #include #include #include #include #include #include #include #include

4950 // puerto de conexin 100 /* Sigue -----------------> */

#define PUERTO #define MAXTAMBUFFER

Programacin con Sockets

54

Un ejemplo con UDP/*----------------------------------------------*/ /* FUNCION: main */ /* DESCRIPCION: funcion principal del programa */ /* PARAMETROS: ninguno */ /*----------------------------------------------*/ int main() { int descriptorSocket ; /* descriptor del socket struct sockaddr_in direccionReceptor ; /* direccin de socket del receptor struct sockaddr_in direccionEmisor ; /* direccin de socket del emisor int longitudDireccion ; /* longitud de la direccin de socket int numeroDeBytes ; /* nmero de bytes leidos char buffer[MAXTAMBUFFER]; /* buffer de recepcin de datos if ((descriptorSocket = socket(PF_INET, SOCK_DGRAM, 0)) == -1) { perror("socket"); exit(-1); } /* if */ direccionReceptor.sin_family = AF_INET direccionReceptor.sin_port = htons(PUERTO) direccionReceptor.sin_addr.s_addr = INADDR_ANY memset(&(direccionReceptor.sin_zero), '\0', 8) ; ; ; ;

*/ */ */ */ */ */

/* Sigue -----------------> */

Programacin con Sockets

55

Un ejemplo con UDP. Receptor/* */ Programacin con Sockets

#define PUERTO 4950

57

Un ejemplo con UDP. Emisor/*----------------------------------------------*/ /* FUNCION: main */ /* DESCRIPCION: funcion principal del programa */ /* PARAMETROS: */ /* 1.- Direccin del receptor del mensaje */ /* 2.- Mensaje a enviar */ /*----------------------------------------------*/ int main(int argc, char *argv[]) { int descriptorSocket struct sockaddr_in direccionReceptor struct hostent * identificadorHost int numeroDeBytes

; ; ; ;

/* /* /* /*

descriptor del socket direccin del receptor identificador del host nmero de bytes leidos

*/ */ */ */

/* Sigue -----------------> */

Programacin con Sockets

58

Un ejemplo con UDP. Emisor/* */

Programacin con Sockets

59

Un ejemplo con UDP. Emisor/* h_addr) ; memset(&(direccionReceptor.sin_zero), '\0', 8) ; if ((numeroDeBytes = sendto(descriptorSocket, argv[2], strlen(argv[2]), 0, (struct sockaddr *)&direccionReceptor, sizeof(struct sockaddr))) == -1) { perror("sendto"); exit(-1); } /* if */ printf("%d bytes han sido enviados a %s\n", numeroDeBytes, inet_ntoa(direccionReceptor.sin_addr)); close(descriptorSocket); } /* main */

Programacin con Sockets

60

Ejemplo con UDP. Compilacin y ejecucinCompilacinServidor (Linux):gcc o receptorUDP receptorUDP.c

Cliente (Linux):gcc o emisorUDP emisorUDP.c

En Solaris, hay que incluir adems-lnsl lsocket

EjecucinEjecutar en la mquina 130.114.128.10% ./receptorUDP

Ejecutar en cualquier otra mquina% ./emisorUDP 130.114.128.10 HOLA MUNDOProgramacin con Sockets

61

Sockets en JavaDefinicin Utilizacin Ejemplo: Servidor de fechas

Programacin con Sockets

62

DefinicinSockets en JavaEl lenguaje Java proporciona un paquete para trabajar con sockets

Comparado con UnixLa utilizacin de sockets con Java se ha simplificado Se pueden enviar objetos Java No existe el problema de la heterogeneidad entre el emisor y el receptor de los mensajes En lugar de usar descriptores de ficheros en Java se usan streams de entrada y de salidaProgramacin con Sockets

63

UtilizacinLos pasos que tiene que realizar un programa Java basado en sockets son los siguientes:1. 2.

3.

4. 5.

Abrir un socket Abrir un stream de entrada y un stream de salida, y vincularlos al socket Leer y escribir a travs de los streams de acuerdo a un protocolo determinado Cerrar los streams Cerrar el socketProgramacin con Sockets

64

Servidor de fechas: Constantes/******************************************************************/ /* FICHERO: Constantes.java */ /* DESCRIPCION: fichero de constantes para hacer uso de un */ /* servidor de fechas */ /* COMENTARIOS: version realizada sobre un sistema Linux */ /******************************************************************/ interface Constantes { public static final String DIRECCION_IP = "130.114.128.10" ; public static final int PUERTO_TCP = 7330 ; public static final int SOLICITUD_FECHA = 1 ; public static final int RESPUESTA_FECHA = 2 ; } // Constantes

Programacin con Sockets

66

Servidor de fechas: Servidor/****************************************************************/ /* FICHERO: Servidor.java */ /* DESCRIPCION: codigo de un servidor de fechas */ /* FECHA: 13/10/00 */ /* COMENTARIOS: */ /****************************************************************/ import java.io.* ; import java.net.* ; public class Servidor { public static void main (String args[]) throws IOException { ServerSocket socketServidor = new ServerSocket(Constantes.PUERTO_TCP); Socket socket = null ; try { while (true) { System.out.println("Esperando conexion ...") ; socket = socketServidor.accept() ; System.out.println("Servidor: cliente conectado") ;// Sigue -----------------> (1)

Programacin con Sockets

67

Servidor de fechas: Servidor// (2)

Programacin con Sockets

68

Servidor de fechas: Servidor// (2)

Programacin con Sockets

71

Servidor de fechas: Cliente//