Práctica 1 Programación de Aplicaciones Distribuidas ...

22
Práctica 1 Programación de Aplicaciones Distribuidas: Sockets UDP Laboratorio de Comunicación de Datos ITT Telemática – Septiembre 2011

Transcript of Práctica 1 Programación de Aplicaciones Distribuidas ...

Page 1: Práctica 1 Programación de Aplicaciones Distribuidas ...

Práctica 1Programación de Aplicaciones

Distribuidas: Sockets UDP

Laboratorio de Comunicación de DatosITT Telemática – Septiembre 2011

Page 2: Práctica 1 Programación de Aplicaciones Distribuidas ...

Aplicaciones Distribuidas Su funcionalidad se distribuye en diferentes máquinas Servidor Web Aplicación FTP eMule…

Modelo cliente-servidor: Proceso cliente: envía peticiones Proceso servidor: atiende peticiones

Necesario canal de comunicación

Introducción

2

Page 3: Práctica 1 Programación de Aplicaciones Distribuidas ...

Aplicaciones Distribuidas Canal de comunicación entre dos máquinas UNIX

Introducción

Aplicacióncliente

TCP UDP

IP

Ethernet

Aplicaciónservidor

TCP UDP

IP

EthernetDirección

MAC(48 bits)

DirecciónIP

(32 bits)

PuertoTCP/UDP(16 bits)

ARP

3

Page 4: Práctica 1 Programación de Aplicaciones Distribuidas ...

Asociaciones y sockets Canal de comunicación

Protocolo, dirección local, proceso local, dirección remota, proceso remoto

Como un cable que une dos procesos Socket: extremo de un canal (enchufe)

Máquina local: protocolo, dirección local, proceso local Máquina remota: protocolo, dirección remota, proceso remoto

API de sockets Proporciona estructuras de datos y funciones para la programación de

aplicaciones distribuidas

Introducción

4

Page 5: Práctica 1 Programación de Aplicaciones Distribuidas ...

Establecimiento del canal: socket() Crea una canal de comunicaciones bidireccional

#include <sys/types.h>#include <sys/socket.h>int socket (int familia, int tipo, int protocolo)

Parámetros Familia: AF_INET Tipo:

Orientado a conexión (SOCK_STREAM), No orientado a conexión (SOCK_DGRAM)

Protocolo: 0 Devuelve identificador del socket (entero no negativo), -1 si

error. No asocia dirección IP ni puerto

Programación Sockets

5

Page 6: Práctica 1 Programación de Aplicaciones Distribuidas ...

Establecimiento del canal: bind() Asigna al socket una dirección IP y un puerto (TCP/UDP) locales

determinados.#include <sys/types.h>#include <sys/socket.h>int bind (int sockfd,

(struct sockaddr *) direccion, int longitud)

Parámetros sockfd: identificador socket devuelto por la función socket() direccion: estructura que contiene el puerto y la dirección IP locales longitud = sizeof (direccion)

Devuelve -1 en caso de error

Programación Sockets

6

Page 7: Práctica 1 Programación de Aplicaciones Distribuidas ...

Establecimiento del canal: bind() Estructura sockaddr_in (para IPv4)

#struct sockaddr_in {shortsin_family; /* AF_INET */u_short sin_port; /* puerto TCP/UDP */struct in_addr sin_addr; /* dirección IP */char sin_zero[8]; /* 8 bytes ceros */

}struct in_addr {u_long s_addr; /* dirección IP */

}

Programación Sockets

7

Page 8: Práctica 1 Programación de Aplicaciones Distribuidas ...

Establecimiento del canal: bind() Estructura sockaddr genérica

#struct sockaddr {short sa_family; /* AF_xxx */char sa_data[14]; /* 14 bytes familia */

}

Uso de la estructura La estructura sockaddr siempre se pasa por referencia

(dirección) Siempre va acompañada de su tamaño

Sentido aplicaciónkernel: paso por valor Sentido kernel aplicación: paso por referencia

Programación Sockets

8

Page 9: Práctica 1 Programación de Aplicaciones Distribuidas ...

Establecimiento del canal: bind()

Programación Sockets

Uso de bind() Obligatorio en el proceso servidor:

Informa al sistema operativo de que todo el tráfico recibido en un determinado puerto le corresponde

Opcional en el proceso cliente Si no se especifica puerto (sin_port=0) el SO asigna el

primero libre Si no se especifica dirección IP

(sin_addr=INADDR_ANY) se aceptan conexiones/datagramas por cualquier interfaz local

9

Page 10: Práctica 1 Programación de Aplicaciones Distribuidas ...

Establecimiento del canal: Ejemplo

Programación Sockets

if ((ds = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {error("socket");exit(1);

}

bzero ((char *) &servidor, sizeof (servidor);servidor.sin_family = AF_INET; /* familia Internet */servidor.sin_port = htons (5001); /* Puerto formato red */servidor.sin_addr.s_addr = inet_addr(“172.29.20.43”);

longitud1 = sizeof(servidor);

if( bind (ds, (struct sockaddr *) &servidor, longitud1) == -1 {error("bind");exit(1);

}

Creación del Socket UDP

Asocia el socket a una dirección IP y puerto

10

Page 11: Práctica 1 Programación de Aplicaciones Distribuidas ...

Funciones auxiliares

Programación Sockets

Inicializar a cero una estructura (e.g. sockaddr_in) bzero (char * direccion, int long)

Traducir direcciónes IP formato ASCII (xx.xx.xx.xx) a formato de red (y viceversa) unsigned long inet_addr (char * dir_ascii) char * inet_ntoa (struct in_addr dir_red)

Ordenación de bytes unsigned long htonl (x) /* h->n long */ unsigned short htons (x) /*h->n short */ unsigned long ntohl (x) /* n->h long */ unsigned short ntohs (x) /* n->hshort */

11

Page 12: Práctica 1 Programación de Aplicaciones Distribuidas ...

Envío de datagramas UDP: sendto()

Programación Sockets

Envía datos a través de un socket a un determinado destino#include <sys/types.h>#include <sys/socket.h>int sendto (int sockemisor, char * mensg,

int lgmensg, int opcion, (struct sockaddr *) destino, int lgdest);

Parámetros

Devuelve n° de bytes transmitidos, -1 en caso de error

sockemisor: descriptor socket origenmensg: datos del datagramalgmensg: longitud (n° bytes) datoslgdest = sizeof (destino)

opcion: 0destino: estructura sockaddr_in que contiene el puerto y la dirección IP

12

Page 13: Práctica 1 Programación de Aplicaciones Distribuidas ...

Recepción de datagramas: recvfrom()

Programación Sockets

Espera y lee un datagrama de la cola de recepción asociada a un socket#include <sys/types.h>#include <sys/socket.h>int recvfrom (int sockreceptor, char * mensg,

int lgmensg, int opcion, (struct sockaddr *) origen, int *lgorig);

Parámetros

Devuelve n° de bytes recibidos, -1 en caso de error

sockemisor: descriptor socket destinomensg: buffer recepciónlgmensg: longitud (n° bytes) bufferlgorig = sizeof (destino)

opcion: 0origen: estructura sockaddr_in que almacenará el puerto y la dirección IP del emisor

13

Page 14: Práctica 1 Programación de Aplicaciones Distribuidas ...

Cierre del canal: close()

Programación Sockets

Cierra el canal de comunicaciones bidireccional creado previamente por socket#include <sys/types.h>

#include <sys/socket.h>

close (int sockfd);

Parámetros sockfd: descriptor devuelto por socket()

14

Page 15: Práctica 1 Programación de Aplicaciones Distribuidas ...

Arquitectura básica del servidor UDP socket(): crea el canal

bind(): asocia al canal una dirección IP y un puerto

recvfrom(): recibe datos de un cliente

sendto(): envía datos al cliente a través del socket

Práctica I

15

Page 16: Práctica 1 Programación de Aplicaciones Distribuidas ...

Arquitectura básica del cliente UDP socket(): crea el canal

bind(): asocia al canal una dirección IP y un puerto

sendto(): envía datos al servidor a través del socket

recvfrom(): recibe datos del servidor

close(): cierra el canal

Práctica I

16

Page 17: Práctica 1 Programación de Aplicaciones Distribuidas ...

Ejemplo: Servidor de “eco” UDP/* * Ejemplo servidor datagrama eco (ecodgramserv.c)*/

#include <stdio.h>#include <stdlib.h>#include <errno.h>#include <string.h>#include <sys/types.h>#include <netinet/in.h>#include <sys/socket.h>#include <sys/wait.h>

#define SERVPUERTO 9999 /* puerto de escucha del servidor */#define MAXBUFF 100 /* longitud máxima mensajes replicar con

ECO */

Práctica I

17

Page 18: Práctica 1 Programación de Aplicaciones Distribuidas ...

Ejemplo: Servidor de “eco” UDPmain(){

int ds; /* descriptor socket */struct sockaddr_in servidor; /* info. Servidor */struct sockaddr_in cliente; /* info. Cliente */int longitud1, longitud2, n, m;char buff[MAXBUFF]; /* buffer recepción mensajes*/

if ((ds = socket(AF_INET, SOCK_DGRAM, 0)) == -1) {error("socket");exit(1);

}

Práctica I

Creación del Socket UDP

18

Page 19: Práctica 1 Programación de Aplicaciones Distribuidas ...

Ejemplo: Servidor de “eco” UDP

bzero ((char *) &servidor, sizeof (servidor);servidor.sin_family = AF_INET; /* familia */servidor.sin_port = htons (PUERTO); /*formato red */servidor.sin_addr.s_addr = INADDR_ANY; /* Cualquier IP */

longitud1 = sizeof(servidor);

if( bind(ds,(struct sockaddr *)&servidor, longitud1) == -1 {

error("bind");exit(1);

}

Práctica I

Inicializar sockaddr_in

Enlazar la dirección local al socket

19

Page 20: Práctica 1 Programación de Aplicaciones Distribuidas ...

Ejemplo: Servidor de “eco” UDPfor (;;) {

longitud2 = sizeof (cliente);bzero ((char *) &cliente, longitud2);

n = recvfrom(ds, buff, MAXBUFF, 0, (struct sockaddr *)&cliente, &longitud2);

if (n == -1) {error ("recvfrom");exit (1);

}

printf (“Datagrama procedente de %s\n",inet_ntoa (cliente.sin_addr));

printf (“Butes recibidos: %d\n",n);printf(“Contenido datagrama: %s\n",buff);

Práctica I

Recibir datagrama

20

Page 21: Práctica 1 Programación de Aplicaciones Distribuidas ...

Ejemplo: Servidor de “eco” UDPm = sendto (ds, buff, n, 0,

(struct sockaddr *)&cliente, &longitud2);if (m == -1) {

error (“sendto");exit (1);

}}

close (ds);}void error (char * mensaje){

perror (mensaje);exit(1);

}

Práctica I

Enviar datagrama

Cerrar socket

21

Page 22: Práctica 1 Programación de Aplicaciones Distribuidas ...

Bibliografía

J. M. Arco Rodriguez et al. Programación de Aplicaciones en Redes de Comunicaciones bajo Entorno Unix

Páginas man de Linux

Referencias

22