Sockets
-
Upload
benjamin-sanchez -
Category
Documents
-
view
1.180 -
download
0
Transcript of Sockets
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//