1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf ·...

21
Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP Prog. Avanzada Bibliografía 21/04/2005 Tema 6. Sistemas C/S Básicos con Sockets Índice 1 de 21 Enrique Alba Torres Universidad de Málaga (UMA) Programación C/S Básica

Transcript of 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf ·...

Page 1: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

1 de 21

Enrique Alba Torres

Universidad de Málaga (UMA)

Programación C/S Básica

Page 2: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

2 de 21

Introducción• Los servicios Internet se ofertan como sistemas Cliente/Servidor• Los protocolos de base suelen ser peer-to-peer (igual-a-igual)• En cualquier caso se necesita una interfaz para programar• BSD socket es una interfaz estándar orientada al paso de mensajes

entre procesos para programar en red sobre TCP/IP• Las primitivas (funciones en C) y tipos de datos (estructuras, ...) de

los sockets conforman un API para programar servicios en red• Existen sockets para UNIX, Linux, Windows y otros SS.OO.• Existen API’s para sockets en C, C++, Java y otros lenguajes

#include <sys/socket.h> ...main(){ int sservice; ...

struct sockaddr_in sout; ...sservice = socket(…); ...sout.sin_family = AF_INET; ...sout.sin_port = 4000; ...connect(sservice,sout,…); ...

}

EJEMPLO

Page 3: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

3 de 21

Sistemas C/S (I)• Un servidor realiza un proceso repetitivo, normalmente sin final,

que consiste en un bucle básico de atención a los clientes:

• La espera de peticiones puede hacerse:A. Sobre un protocolo o varios (servicio multiprotocolo)B. Para proporcionar un servicio o varios (multiservicio)

• La atención al cliente puede hacerla:A. Directamente el servidor (iterativo)B. Un servidor esclavo generado (concurrente)

• Según el nivel de transporte usado el servicio puede ser:A. Orientado a la conexión (si el servidor utiliza TCP)B. Sin conexión (si el servidor utiliza UDP)

...while(true){

esperar petición de un cliente;atender al cliente;

}...

Page 4: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

4 de 21

Sistemas C/S (II)

difícil de programar y mantener

versatilidad y potencia

Multiservicio

difícil de lograr para algunos servicios

servicio independ. de implementación

Multiprotocolo

posible pérdidas, desorden y + complejo

comunicación eficiente y “ligera”

Sin Conexión

puede ser costoso para algunos servicios

información fluye correcta y ordenada

Or. Conexión

gestión de procesos hijos esclavos (fork+signal)

atención al cliente indep. del servicio

Concurrente

la cola de clientes pendientes puede crecer

simple de programar

Iterativo

InconvenientesVentajas

Page 5: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

5 de 21

Esquemas de Implementación C/S usando Sockets

Socket en un puerto bien-conocidousado para toda la comunicación

Servidor

SERVIDORES ITERATIVOS

Socket parapeticiones deconexión

Socket parauna conexiónindividual

Proceso deaplicación delservidor

Sistema operativo.

Servidor

SIN CONEXIÓN

ORIENTADO ALA CONEXIÓN

Page 6: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

6 de 21

Esquemas de Implementación C/S usando Sockets

SERVIDORES CONCURRENTE (CON/SIN CONEXIÓN)

Esclavo1 Esclavo n

............

Socketpara peticionesde conexión

..Sockets paraconexionesindividuales

Procesos de aplicación delservidor

Sistema Operativo

Maestro

Socket parapeticiones deconexión

Sockets paraconexionesindividuales

....

Proceso deaplicación deun servidor

Sistema Op.

Servidor

VARIOS PROCESOS

MONOPROCESO

Page 7: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

7 de 21

Primitivas: Básicas de Comunicación

Primitiva Funciónsocket Crea un TSAP del servicio especificado (TCP o UDP, p.e.)

bind Registra en el sistema el servicio asociado a un socket

listen Crea una cola para almacenar CR que lleguen (pasivo)

accept Saca una CR de la cola del socket o espera a que llegue una

connect Inicia una conexión con un socket remoto (local remoto)

Shutdown Cierran la conexión de un socket (ambos extremosclose pueden usarlo independientemente)

sendto Envían un mensaje por un descriptor de socket dadowrite normalmente de forma no bloqueante

recvfrom Reciben un mensaje por un descriptor de socket dadoread normalmente de forma bloqueante

select Informa sobre los sockets listos para escribir o leer de ellos

Page 8: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

8 de 21

Primitivas: Obtención de Información

Primitiva Funcióngethostbyname Obtiene información de una máquina remota a partir

de su nombre

gethostbyaddr Obtiene información de una máquina remota a partir de su dirección IP

getservbyport Obtiene información de un servicio a partir del puerto

getservbyname Obtiene información de un servicio a partir del nombre

getaddrinfo Combina en una sola primitiva la funcionalidad de todas las anteriores primitivas

getprotobyname Obtiene información de un protocolo a partir de su nombre

getprotobynumber Obtiene información de un protocolo a partir de su número

Page 9: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

9 de 21

Familias de Direcciones (I)• Cada familia representa un dominio con sockets de similares características• La familia determina el formato y los protocolos disponibles• Las direcciones determinan el host y la aplicación de manera inequívoca• La estructura genérica de una dirección es:

struct sockaddr{ u_short sa_family; /* Familia: ctes. de la forma AF_xxx */

char sa_data[14]; /* 14 bytes dependientes de la familia */};

• Algunos de los donimios disponibles son:AF_INET: protocolos de InternetAF_UNIX: sockets locales que corresponden a ficherosAF_CCITT: protocolos CCITT como X.25AF_SNA: protocolos de redes IBM SNAAF_DECnet: protocolos de redes DEC

• La estructura para Internet-TCP/IP (AF_INET) es como sigue:struct sockaddr_in{ short sin_family; /* Valor AF_INET*/

u_short sin_port; /* 16 bits con el número del puerto */u_long sin_addr; /* 32 bits (red+ host)*/char sin _zero[8]; /* 8 bytes no usados */

};

Page 10: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

10 de 21

Familias de Direcciones (II)

sa_familysa_family

sa_datasa_data

sockaddr sockaddr_in

AF_INET

sin_port

sin_addr

sin_zero

Page 11: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

11 de 21

Valores Nativos y Tratamiento de direcciones de IP

• Fisicamente los datos se pueden representar con dos formatos:A. Little-Endian

B. Big-Endian

• Posibles problemas al comunicar arquitecturas diferentes.• Se diferencias dos representaciones lógicas:

A. Host Byte Order: Orden físico de la máquina origen/destino. B. Network Byte Order: Orden de transmisión de los datos.

• Funciones de conversión de formato:- Host Byte Order a Network Byte Order: htons (short) y htonl (long)

- Network Byte Order a Host Byte Order: ntohs (short) y ntohl (long)

• Funciones de conversión de direcciones IP:- De Ascii a Network: inet_addr y inet_aton

- De Network a Ascii: inet_ntoa

Low Byte High Byte

High Byte Low Byte

Addr Addr + 1

Addr Addr + 1

Page 12: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

12 de 21

Tipos de Sockets• Cada tipo de socket tiene ciertas propiedades para realizar las transmisiones

• Los tipos más utilizados son:

SOCK_STREAM

Orientado a la conexión (TCP si AF_INET)

SOCK_DGRAM

Servicio sin conexión (UDP si AF_INET)

SOCK_RAW

Acceso a bajo nivel (IP si AF_INET) –¡sólo puede usarlos el root! –

Page 13: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

13 de 21

Implementación de un C/S sobre TCP

socket (crea socket)

connect (con. servidor)

write (pide servicio)

read (rec. respuesta)

close (cierra conex.)

CLIENTE

socket (crea socket)

bind (qué puerto usa)

read (rec. petición)

write (sirve petición)

close (cierra conex.)

accept (espera conex.)

SERVIDOR

listen (encolar petic.)

Page 14: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

14 de 21

Implementación del Cliente sobre TCP (I)

/****************************************************************\* (client.c) Client for reading input messages from keybd. *\****************************************************************/

#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>

#include <stdio.h>#include <string.h>

#define TRUE 1#define FALSE 0

main(){ int sservice, end;

char buf[128];struct protoent *ppe;struct sockaddr_in sout;ppe = getprotobyname("tcp");/*Get the tcp-entity data*/

/*Open the socket*/sservice=socket(PF_INET,SOCK_STREAM,ppe->p_proto);

Incluimos el API

Pedimos información sobre TCP

Abrimos un TSAP

Page 15: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

15 de 21

Implementación del Cliente sobre TCP (II)

sout.sin_family = AF_INET; /*ARPANET */sout.sin_addr.s_addr = getservbyport(4000,"tcp"); /* Which

server?*/sout.sin_port = 4000; /*Output port*/

/*Connect to the server*/connect(sservice,(struct sockaddr *)&sout, sizeof(sout));end = FALSE;while(!end) /*Client Service Loop*/{ /*Ask for the service*/

printf("\nCLIENT> Send a message...: ");fflush(stdout);scanf("%s",buf);write(sservice,buf,strlen(buf));printf("\nCLIENT>Client sent: %s", buf);fflush(stdout);if (!strcmp(buf,"end")){printf("\nCLIENT>Bye..."); fflush(stdout);end=TRUE;

}}

close(sservice);} /*main()*/

Dirección del Servidor

Conectar con servidor

Msj. para servidor

Cerrar TSAP

Page 16: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

16 de 21

Implementación del Servidor sobre TCP (I)

/****************************************************************\*(server.c) The Server shows received messages in the screen. *\****************************************************************/

#include <sys/types.h>#include <sys/socket.h>#include <netinet/in.h>#include <netdb.h>#include <stdio.h>#include <string.h>#define TRUE 1#define FALSE 0

main(){ int sservice, sclient, l, nbytes_read, end;

char buf[128];struct protoent *ppe;struct sockaddr_in sin, clientfsin;

ppe = getprotobyname("tcp");

/*Open the socket*/sservice=socket(PF_INET,SOCK_STREAM,ppe->p_proto);

/*pse = getservbyname("messages", "tcp"); <---If service is reg.*/

Incluimos el API

Abrimos un TSAP

Pedimos información sobre TCP

Page 17: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

17 de 21

sin.sin_family = AF_INET;sin.sin_addr.s_addr = INADDR_ANY;sin.sin_port = 4000;

sclient=bind(sservice, (struct sockaddr*)&sin, sizeof(sin)); /*Register serv*/

listen(sservice,5);/*Up to 5 pending connections*/sclient=accept(sservice,(struct sockaddr*)

&clientfsin,&l);/*Accept a client*/

/*If concurrent, a children server should be spawned here by using fork()*/end = FALSE;while(!end) /*Give the service*/{

nbytes_read=read(sclient,buf,sizeof(buf));

if (nbytes_read>=0) buf[nbytes_read]='\0'; else {strcpy(buf,"\nSERVER>ERROR IN SERVER!"); end=TRUE; }printf("\nSERVER>Server received: %s", buf);fflush(stdout);if(!strcmp(buf,"end")) end=TRUE;

}printf("\nSERVER>Bye..."); fflush(stdout);close(sclient); /*Never forget to close a socket!*/close(sservice);

} /*main()*/

Implementación del Servidor sobre TCP (II)

Dirección IP+TCP

Leer “petición”

¡Normalmente nunca cerrar sservice!

Registrar, conf., aceptar

Page 18: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

18 de 21

Implementación de un C/S sobre UDP

socket (crea socket)

bind/connect (reg/conectar)

sendto/write (pide servicio)

recvfrom/read (leer respuesta)

close (cierra conex.)

CLIENTE

socket (crea socket)

bind (registrar)

recvfrom (lee petición)

sendto (envía resp.)

SERVIDOR

Page 19: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

19 de 21

Programación avanzada:Opciones de sockets

• Obtención y manipulación de opciones de sockets :setsockopt(socket, level, optname, optval, optlen);getsockopt(socket, level, optname, optval, optlen);

• Principales opciones de socket (level = SOL_SOCKET):SO_DEBUG: modo depuraciónSO_REUSEADDR: reutilización de dirección.SO_SNDBUF: tamaño del buffer de envíoSO_RCVBUF: tamaño del buffer de recepciónTCP_NODELAY: no retrasar los envíos

• Mas propiedades de sockets (operaciones sobre ficheros): fnctl(socket, cmd, …) e ioctl(socket, cmd, …)

int sfd, yes = 1; ...sfd = socket(AF_INET, SOCK_STREAM, 0); ...setsockopt(sfd, SOL_SOCKET, SO_REUSEADDR,

&yes, sizeof(yes));...fnctl(sfd, F_SETFL, O_NONBLOCK);

EJEMPLO

Page 20: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

20 de 21

Programación avanzada:Multiplexación de E/S

select(maxfds. rfd, wfd, efd, timeour);

• Operaciones sobre conjunto de descriptores:FD_ZERO: Vacía el conjuntoFD_SET: Añade un descriptor al conjuntoFD_CLR: Elimina un descriptor al conjuntoFD_ISSET: Comprueba si está activo un descriptor

fd_set rd, act_rd; ...FD_ZERO(&rd); FD_SET(s1,&rd);FD_SET(s2,&rd); ...while(1){...bcopy(&rd, &act_rd); ...select(dsize, &act_rd, NULL, NULL, NULL);...if(FD_ISSET(s1, &act_rd)) ...else if(FD_ISSET(s2, &act_rd)) ...

EJEMPLO

Page 21: 1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf · Introducción Sistemas C/S Primitivas Familias y Tipos C/S sobre TCP C/S sobre UDP

Introducción

Sistemas C/S

Primitivas

Familias y Tipos

C/S sobre TCP

C/S sobre UDP

Prog. Avanzada

Bibliografía21/04/2005

Tema 6. Sistemas C/S

Básicos con Sockets

Índice

21 de 21

Bibliografía

• Internetworking with TCP/IP (Vol. 1)Comer, D.E. Prentice-Hall. 1991.

• Internetworking with TCP/IP (Vol 3)Comer D.E., Stevens, D.L. Prentice-Hall. 1993.

• Unix Network ProgrammingStevens, W.R. Prentice-Hall. 1990.

• Computer Networks and Internets (2nd edition)Comer, D.G. Prentice-Hall. 1999

• A Guide to the TCP/IP Protocol SuiteWilder, F. Artech House. 1993.