1 de 21 Tema 6. Sistemas C/S Programación C/S Básica ...eat/courses/cdd-contents/sockets.pdf ·...
Transcript of 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
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
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
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;
}...
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
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
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
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
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
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 */
};
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
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
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! –
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.)
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
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
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
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
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
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
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
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.