INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INGENIERÍA DE PROTOCOLOSINGENIERÍA DE PROTOCOLOSINGENIERÍA DE PROTOCOLOS INGENIERÍA DE PROTOCOLOS DE COMUNICACIONESDE COMUNICACIONES
(MÓDULO 2)(MÓDULO 2)(MÓDULO 2)(MÓDULO 2)
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOSF. I. M.
F. I. M.
L.S.I.I.S
L.S.I.I.S
INGENIERÍA DE PROTOCOLOSINGENIERÍA DE PROTOCOLOSDE COMUNICACIONESDE COMUNICACIONES
(MÓDULO 2)
http://www.personal.fi.upm.es/~lmengual/inicio_IP.html
LUIS MENGUAL GALÁN
LUIS MENGUAL (c)
LUIS MENGUAL GALÁN
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
OBJETIVOSOBJETIVOSOBJETIVOSOBJETIVOS
Describir las técnicas de descripción formal utilizadas para especificar formalmente protocolos de comunicaciones yespecificar formalmente protocolos de comunicaciones y presentar sus ventajas en la ingeniería de protocolos
Analizar las interfaces de programación más utilizadas en el entorno corporativo: Sockets de Berkeley Windowsentorno corporativo: Sockets de Berkeley, Windows Sockets, Sockets en Java.
Comprender las técnicas de implementación de aplicaciones di t ib id tili d l dif t i t f ddistribuidas utilizando las diferentes interfaces de programación y el modelo cliente-servidor.
Estudiar el rendimiento de las implementaciones de software cliente y servidor.
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
ÍNDICEÍNDICEÍNDICEÍNDICE1. ESPECIFICACIÓN, DISEÑO Y VERIFICACIÓN DEPROTOCOLOS
1.1 Niveles de descripción de una arquitectura estructurada1.1.1 Definición de la Arquitecturaq1.1.2 Especificación de servicios1.1.3 Especificación formal de protocolos
1.2 Desarrollo de Protocolos 1 2 1 E ifi ió F l1.2.1 Especificación Formal
1.2.1.1 Validación1.2.1.2 Verificación1.2.1.3 Análisis de Prestaciones
1.2.2 Implementación1.2.3 Conformidad
1.3 Metodologías de Especificación1 3 1 L j N l1.3.1 Lenguaje Natural1.3.2 Grafos de Control de Comunicaciones1.3.3 Máquinas de Estados Finitos Extendidas1.3.4 Redes de Petri
LUIS MENGUAL (c)
1.3.4 Redes de Petri1.3.5 SDL1.3.6 Estelle1.3.7 Lotos
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
ÍNDICEÍNDICEÍNDICEÍNDICE1
2. IMPLEMENTACIÓN DE PROTOCOLOS (I)2. IMPLEMENTACIÓN DE PROTOCOLOS (I)
2.1 Modelo cliente-servidor2.1.1 Terminología y conceptose o og a y co ceptos2.1.2 Comparación con otros modelos
2.1.2.1 Aplicaciones peer to peer,2.1.2.2 Teoría de Agentesg
2.2 Modelo Unix2.2.1 Comunicación entre procesos2.2.2 Procesos Concurrentes2.2.3 E/S asíncronas
2.3 Interfaces de Programación de Aplicaciones (API, AplicationProgramming Interface)
2.3.1 Funcionalidad y especificación de las Interfaces deProgramación2.3.2 Interfaces existentes
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
ÍNDICEÍNDICEÍNDICEÍNDICE1
2. IMPLEMENTACIÓN DE PROTOCOLOS (II)2. IMPLEMENTACIÓN DE PROTOCOLOS (II)
2.4 Interfaz Sockets de Berkeley2.4.1 Algoritmos de diseño Software Clientego t os de d se o So t a e C e te
2.4.1.1 Arquitectura del cliente2.4.1.2 Tipos de clientes (TCP/UDP)
2.4.2 Implementación Software Clientep2.4.2.1 Ejemplos clientes TCP/UDP
2.4.3 Algoritmos de diseño Software Servidor2.4.3.1 Arquitectura del servidor2.4.3.2 Tipos de servidores (TCP/UDP, concurrentes, iterativos)
2.4.4 Implementación Software Servidor2.4.4.1 Servidores Iterativos no Orientados a Conexión (UDP)2.4.4.2 Servidores Iterativos Orientados a Conexión (TCP)2.4.4.3 Servidores Concurrentes orientados a conexión (TCP)2.4.4.4 Servidores Concurrentes. Un solo proceso TCP2 4 4 5 S id M lti t l (TCP UDP)
LUIS MENGUAL (c)
2.4.4.5 Servidores Multiprotocolo (TCP, UDP)2.4.4.6 Servidores Multiservicio (TCP, UDP)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
ÍNDICEÍNDICE1
ÍNDICEÍNDICE
2. IMPLEMENTACIÓN DE PROTOCOLOS (III)2.4.5 Eficiencia y gestión de la concurrencia en servidores
2 4 5 1 El ió t d l it ti t2.4.5.1 Elección entre un modelo iterativo y concurrente2.4.5.2 Nivel de concurrencia2.4.5.3 Concurrencia en función de la demanda2 4 5 4 Coste de la concurrencia2.4.5.4 Coste de la concurrencia
2.4.6 Concurrencia en clientes2.4.6.1 Ventajas de la concurrencia2 4 6 2 Implementaciones con varios procesos2.4.6.2 Implementaciones con varios procesos2.4.6.3 Implementación con un solo proceso
2.4.7 Procedimientos Remotos2 4 7 1 Servicios Básicos sobre RPC2.4.7.1 Servicios Básicos sobre RPC2.4.7.2 Construcción de aplicaciones
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
ÍNDICEÍNDICEÍNDICEÍNDICE
2. IMPLEMENTACIÓN DE PROTOCOLOS (IV)2.5 Interfaz Windows Sockets
2.5.1 Comparación sockets de Berkeley2.5.1 Comparación sockets de Berkeley2.5.2 Desarrollo de aplicaciones
2.6 Interfaz sockets en Java2.6.1. Introducción2.6.2. Direcciones de Internet2.6.3. Sockets TCP
2 6 3 1 Sockets para clientes2.6.3.1 Sockets para clientes 2.6.3.2 Sockets para servidores 2.6.3.3 Servidores multiusuario 2 6 3 4 Sockets seguros2.6.3.4 Sockets seguros
2.6.4. Datagramas y sockets UDP2.6.5. Sockets multicast2 6 6 C i URL
LUIS MENGUAL (c)
2.6.6. Conexiones a URLs2.6.7. Otras alternativas (Java RMI, Java IDL)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
BIBLIOGRAFÍABIBLIOGRAFÍABIBLIOGRAFÍABIBLIOGRAFÍA
“USING FORMAL DESCRIPTION TECHIQUES” An Introduction USING FORMAL DESCRIPTION TECHIQUES An Introduction to Estelle, Lotos and SDL. Edited by K.J. Turner. John Wiley &Sons 1993
“INTERNETWORKING WITH TCP/IP CLIENT-SERVER INTERNETWORKING WITH TCP/IP. CLIENT-SERVER PROGRAMMING AND APLICATIONS BSD SOCKETS” VERSION VOLUME III. D. Comer, R. Stevens. Prentice Hall. 1993
“UNIX NETWORK PROGRAMMING” R Stevens Prentice Hall UNIX NETWORK PROGRAMMING . R. Stevens, Prentice Hall. 1998
“INTERNETWORKING WITH TCP/IP VOLUME III: CLIENT-SERVER PROGRAMMING AND APPLICATIONS” WindowSERVER PROGRAMMING AND APPLICATIONS . Window Sockets Version. D. Comer, R. Stevens. Prentice Hall. 1997
“NETWORK PROGRAMMING FOR MICROSOFT WINDOWS”. A. Jones J Ohlund Second Edition 2002Jones, J. Ohlund. Second Edition 2002
“JAVA NETWORK PROGRAMMING”. E. R. Harold. O’Reilly 2000, 2ª Edition
LUIS MENGUAL (c)
“JAVA SECURITY”. S. Oaks. O’Reilly 2001, 2ª Edition
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
COMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDA
MODELO CLIENTE-SERVIDOR
cliente servidorSOLICITA SERVICIOS ESPERA LA PETICIÓN DE UN CLIENTEclienteLAS PETICIONES SE HACEN
A TRAVÉS DE UN APIPROCESAMIENTO DE LAINTERFAZ GRÁFICA DE USUARIO
UN CLIENTEPROCESA LA PETICIÓNPUEDE ACEPTA O RETORNARCANTIDADES ARBITRARIAS DEDATOS
PROCESOCLIENTE
PROCESOSERVIDOR
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
COMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDA
LLAMADAS A PROCEDIMIENTOS REMOTOSREMOTE PROCEDURE CALL (RPC)
cliente servidor servidorcliente servidor servidor
call remoteproc. A
call remoteproc. Bproc. A proc. B
Respondto caller
Respondto callerRespondto caller
exit
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
COMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDA
AGENTES MÓVILESAGENTES MÓVILES
servidor
clienteSERVIDOR
CÓDIGOPROCESOCLIENTE
AGENTE DELCLIENTE
CÓDIGO
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTRODUCCIÓN: AGENTESINTRODUCCIÓN: AGENTESINTRODUCCIÓN: AGENTESINTRODUCCIÓN: AGENTES
“Un agente es un proceso software que representa a un cliente y que se mueve a través de la red tomando ciertas decisiones para atender a un servicio”p
Un agente software tiene tres dimensiones:– Representación
» Un agente representa a un usuario frente a otros sistemas y» Un agente representa a un usuario frente a otros sistemas y otros agentes
– Movilidad» Un agente se mueve por la red (pueden tener un itinerario de» Un agente se mueve por la red (pueden tener un itinerario de
viaje: lista de destinos y plan de viaje)» Los agentes pueden recoger información a medida que viajan
de una máquina a otra– Inteligencia
» Capacidad de un agente para aplicar el conocimiento para la resolución de problemas
LUIS MENGUAL (c)
» Un agente puede tomar decisiones basandose en los datos que recogen
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTRODUCIÓN: AGENTESINTRODUCIÓN: AGENTESINTRODUCIÓN: AGENTESINTRODUCIÓN: AGENTES
Ejecuta acciones
Ejecuta accionesrecoge información
Toma decisiones
Ejecuta accionesrecoge información
Toma decisiones
agenteEjecuta acciones
recoge información
agente agente
INTERNET agente
Toma decisiones
agente agenteagente
Ejecuta accionesrecoge información
Ejecuta accionesrecoge información
LUIS MENGUAL (c)
recoge informaciónToma decisiones
recoge informaciónToma decisiones
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
COMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDACOMPUTACIÓN DISTRIBUIDA
APPLETS EN JAVAAPPLETS EN JAVA
idclienteEl usuario pide una apple en java
servidor
NAVEGADORWEB
p pp j
Llega una apple en java
Arranca la máquinaVirtual de java y
Á
Virtual de java ySe ejecuta la applet
LUIS MENGUAL (c)
MÁQUINA VIRTUAL JAVA
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
MODELO CLIENTEMODELO CLIENTE --SERVIDORSERVIDORMODELO CLIENTE MODELO CLIENTE SERVIDORSERVIDOR
UN SERVIDOR ES CUALQUIER PROGRAMA QUE ESPERA UNA PETICIÓN DE UN CLIENTECLIENTE
UN CLIENTE EN UN PROGRAMA QUE ENVÍA UNA PETICIÓN A UN SERVIDOR Y ESPERA UNA RESPUESTAUNA RESPUESTA
UN SERVIDOR DEBE CONTEMPLAR ASPECTOS TALES COMO:ASPECTOS TALES COMO:
– AUTENTIFICACIÓN– AUTORIZACIÓN– SEGURIDAD EN LOS DATOS– SEGURIDAD EN LOS DATOS– PROTECCIÓN
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
MODELO CLIENTE MODELO CLIENTE --SERVIDORSERVIDORARQUITECTURA TCP/IP
TCP/IP PROPORCIONA LOS MECANISMOS C / O O C O OS C S OSBÁSICOS PARA TRANSFERIR DATOS
TCP/IP PERMITE ESTABLECER LA COMUNICACIÓN ENTRE DOS PROGRAMAS DE APLICACIÓNENTRE DOS PROGRAMAS DE APLICACIÓN
TCP/IP NO ESPECIFICA COMO LOS PROGRAMADORES DEBERIAN ORGANIZAR LOS PROGRAMAS DE APLICACIÓN EN UN ENTORNO DISTRIBUIDOEL MODELO MAS EXTENDIDO Y DESARROLLADO EL MODELO MAS EXTENDIDO Y DESARROLLADO PARA LA COMUNICACIÓN ENTRE APLICACIONES ES EL MODELO CLIENTE-SERVIDOR
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
MODELO CLIENTE MODELO CLIENTE --SERVIDORSERVIDORARQUITECTURA TCP/IP
SI CLIENTE Y SERVIDOR UTILIZAN EL PROTOCOLO UDP TENEMOS UNAPROTOCOLO UDP TENEMOS UNA COMUNICACIÓN NO ORIENTADA A CONEXIÓN
SI CLIENTE Y SERVIDOR UTILIZAN EL SI CLIENTE Y SERVIDOR UTILIZAN EL PROTOCOLO TCP TENEMOS UNA COMUNICACIÓN ORIENTADA A CONEXIÓN
UN SERVIDOR PUEDE A SU VEZ ACTUAR COMO CLIENTE PARA ATENDER UNA PETICIÓN
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
MODELO CLIENTE MODELO CLIENTE --SERVIDORSERVIDORARQUITECTURA TCP/IP
EL PROTOCOLO TCP PROPORCIONA FIABILIDAD:
USA NÚMEROS DE SECUENCIA– USA NÚMEROS DE SECUENCIA– ELIMINA PAQUETES DUPLICADOS – EFECTUA RETRANSMISIONES
PROPORCIONA CONTROL DE FLUJO– PROPORCIONA CONTROL DE FLUJO– COMPUTA UN CHECKSUM SOBRE LOS DATOS– INFORMA AL CLIENTE Y SERVIDOR SI LA RED ES INOPERANTE
EL PROTOCOLO UDP NO GARANTIZA UNA ENTREGA FIABLE
– UNA PETICIÓN DE UN CLIENTE (O UNA RESPUESTA DEL (SERVIDOR) SE PUEDE PERDER DUPLICAR, RETARDAR, O ENTREGAR FUERA DE ORDEN
– LOS PROGRAMAS DE APLICACIÓN DEL CLIENTE Y SERVIDOR DEBEN ADOPTAR LAS ACCIONES OPORTUNAS PARA
LUIS MENGUAL (c)
DEBEN ADOPTAR LAS ACCIONES OPORTUNAS PARA DETECTAR Y CORREGIR ERRORES
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
MODELO CLIENTE MODELO CLIENTE --SERVIDORSERVIDORARQUITECTURA TCP/IP
LOS PROGRAMAS DE APLICACIÓN CLIENTE- LOS PROGRAMAS DE APLICACIÓN CLIENTESERVIDOR USARÁN EL PROTOCOLO UDP SI:
– LOS PROGRAMAS DE APLICACIÓN SE HAN DISEÑADO PARA MANEJAR FIABLIDAD Y CONTROL DE ERRORESMANEJAR FIABLIDAD Y CONTROL DE ERRORES
– EL PROTOCOLO DE APLICACIÓN UTILIZA BROADCAST O MULTICASTLA APLICACIÓN NO PUEDE TOLERAR RETARDOS EN LA– LA APLICACIÓN NO PUEDE TOLERAR RETARDOS EN LA CREACIÓN DE CIRCUITOS VIRTUALES TCP
– SE UTILIZAN EN EL ENTORNO DE UNA RED DE ÁREA LOCAL
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
CONCURRENCIACONCURRENCIACONCURRENCIACONCURRENCIA
UN SERVIDOR DEBE SER PROGRAMADO EXPLÍCITAMENTE PARA MANEJAR PETICIONES CONCURRENTESCONCURRENTES
UN PROCESO TIENE ASOCIADO – EL PROPIETARIO– UN PUNTERO DE INSTRUCCIONES– EL PROGRAMA OBJETO– LAS LOCALIZACIONES EN MEMORIA DE LAS ÁREAS DE TEXTO Y
DATOS
EL S.O. DEL SERVIDOR DEBE PERMITIR QUE VARIOS PROCESOS EJECUTEN CONCURRENTEMENTE UNA PARTE DEL CÓDIGO
CADA PROCESO TIENE SU PROPIA COPIA INDEPENDIENTE DE VARIABLES ASOCIADAS
LUIS MENGUAL (c)
DE VARIABLES ASOCIADAS
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
CONCURRENCIACONCURRENCIAOSOSEJEMPLOSEJEMPLOS
#Iinclude <stdio.h>int sum;
#Iinclude <stdio.h>int sum;
main() ´{
int i;
main() ´{
int i;int i;sum=0for (i=1 ; i<5 ; i++) {
printf(“el valor de i es %d\n” i);
int i;sum=0fork(); /*crea un nuevo proceso */ for (i=1 ; i<5 ; i++) {printf( el valor de i es %d\n , i);
fflush(stdout);sum+= i;
}
( ; ; ) {printf(“el valor de i es %d\n”, i);fflush(stdout);sum+= i;}
printf(“la suma es %d\n”,sum);exit(0);
}
}printf(“la suma es %d\n”,sum);exit(0);
LUIS MENGUAL (c)
}}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
CONCURRENCIACONCURRENCIACONCURRENCIACONCURRENCIA
FORK System Call: INT FORK()INT FORK()
– LA LLAMADA AL SISTEMA FORK CREA UNA COPIA DEL PROCESO QUE SE ESTA EJECUTANDOEL PROCESO QUE EJECUTO EL FORK SE LLAMA– EL PROCESO QUE EJECUTO EL FORK SE LLAMA PROCESO PADRE Y EL NUEVO PROCESO CREADO SE LLAMA PROCESO HIJOLA LLAMADA AL SISTEMA SE HACE UNA VEZ (POR EL– LA LLAMADA AL SISTEMA SE HACE UNA VEZ (POR EL PROCESO PADRE) PERO RETORNA DOS VALORES DISTINTOS
– EL VALOR DE RETORNO EN EL PROCESO PADRE ESEL VALOR DE RETORNO EN EL PROCESO PADRE ES EL IDENTIFICADOR (ID) DEL PROCESO HIJO CREADO
– EL VALOR DE RETORNO EN EL PROCESO HIJO ES “0”SI LA LLAMADA AL SISTEMA NO TIENE ÉXITO SE
LUIS MENGUAL (c)
– SI LA LLAMADA AL SISTEMA NO TIENE ÉXITO SE RETORNA “-1”
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
CONCURRENCIACONCURRENCIACONCURRENCIACONCURRENCIA
i ()main() {
int pid;if ( (pid=fork()) == -1) {
perror(“can´t fork”);exit(1);( )
} else if (pid==0) {/*child process*/printf(“child: child pid = %d, parent pid=%d\n”,getpid(),getppid());printf( child: child pid %d, parent pid %d\n ,getpid(),getppid());exit(0);
}else {/*parent process*// parent process /printf(“parent: child pid=%d,parent pid=%d\n”,pid,getpid());exit(0)
}
LUIS MENGUAL (c)
}
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
CONCURRENCIACONCURRENCIACONCURRENCIACONCURRENCIA
EXECVE System Callint execve(char *pathname, char **argv,char **envp) ( p , g , p)
– LA LLAMADA EXCECVE TOMA TRES PARÁMETROS» EL NOMBRE DE UN FICHERO QUE TIENE UN PROGRAMA
OBJETO EJECUTABLEOBJETO EJECUTABLE» UN PUNTERO A UNA LISTA DE ARGUMENTOS PARA PASAR
AL PROGRAMA» UN PUNTERO A UNA LISTA DE ENTORNO» UN PUNTERO A UNA LISTA DE ENTORNO
– EXECVE REEMPLAZA EL CODIGO QUE EL PROCESO ACTUAL EJECUTA CON EL CÓDIGO DEL NUEVO PROGRAMAPARA CREAR UN NUEVO PROCESO QUE EJECUTE EL CÓDIGO– PARA CREAR UN NUEVO PROCESO QUE EJECUTE EL CÓDIGO OBJETO DE UN FICHERO UN PROCESO DEBE LLAMAR A FORK Y EXECVE.LA LLAMADA EXECVE NO CAMBIA EL IDENTIFICADOR DE
LUIS MENGUAL (c)
– LA LLAMADA EXECVE NO CAMBIA EL IDENTIFICADOR DE PROCESO
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
CONCURRENCIACONCURRENCIACONCURRENCIACONCURRENCIA
main() {
int pid;int pid;if ( (pid=fork()) == -1) {
perror(“can´t fork”);exit(1);
} else if (pid==0) {/*child process*/
.execve(“newprogram”, ..., .....)exit(0);( );
}else {/*parent process*/
}
LUIS MENGUAL (c)
}
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
E/S ASINCRONASE/S ASINCRONASE/S ASINCRONASE/S ASINCRONAS
SELECT System Call int select(int nfds, fd_set *readfds,fd_set *writefds, ( , _ , _ ,fd_set *exfds, struct timeval *timeout)
– LA LLAMADA AL SISTEMA SELECT PERMITE QUE UN PROCESO DE USUARIO ORDENE AL KERNEL QUE ESPERE QUE SE PRODUZCANUSUARIO ORDENE AL KERNEL QUE ESPERE QUE SE PRODUZCAN OPERACIONES DE E/S SOBRE UN COJUNTO DE DESCRIPTORES DE FICHEROS Y AVISE AL PROCESO CUANDO UNO DE ESTOS EVENTOS OCURRA.
– FD_SET ES UNA ESTRUCTURA DE BITS, O MÁSCARA QUE IDENTIFICA (MAPEA) UN CONJUTO DE DESCRIPTORES DE FICHEROS
– SELECT RETORNA EL DESCRIPTOR DE FICHERO EN EL QUE SE PRODUCEN OPERACIONES DE E/S; “0” SI SE SUPERA UN LÍMITE DE TIEMPO Y -1 SI SE PRODUCE UN ERROR
Á
LUIS MENGUAL (c)
– SI EL PARÁMETRO DE TIMEOUT ES NULO SE ESPERA INDEFINIDAMENTE HASTA QUE SE PRODUZCA UNA OPERACIÓN E/S
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
E/S ASINCRONASE/S ASINCRONASE/S ASINCRONASE/S ASINCRONAS
LA ESTRUCTURA FD_SET SE MANEJA CON LAS MACROS:LAS MACROS:
– FD_ZERO(fd_set *fdset) INICIILIZA LA MASCARA fdsetFD SET(int fd fd set *fdset) :– FD_SET(int fd, fd_set *fdset) : AÑADE EL DESCRIPTOR fd AL CONJUNTO fdset
– FD_CLR(int fd, fd_set *fdset) : BORRA EL DESCRIPTOR fd DEL CONJUNTO fdsetBORRA EL DESCRIPTOR fd DEL CONJUNTO fdset
– FD_ISSET(int fd, fd_set *fdset) : TESTEA SI SOBRE EL DESCRIPTOR fd SE HA PRODUCIDO UNA OPERACION DE E/SPRODUCIDO UNA OPERACION DE E/S
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
DESCRIPTORESDESCRIPTORESC OSC OSDE FICHEROSDE FICHEROS
EN UNIX CUANDO UNA APLICACIÓN NECESITA EJECUTAR UNA LLAMADA DE E/S LLAMA A LA FUNCION “CREAT” PARA CREAR UN DESCRIPTOR DE FICHERO
EL S.O. MANTIENE UNA TABLA DE DESCRIPTORES DE FICHERO (ARRAY DE PUNTEROS) PARA CADA PROCESO
TABLA DE DESCRIPTORES UNA POR PROCESO
ESTRUCTURA INTERNA PARA FICH 0
ESTRUCTURA INTERNA PARA FICH 1
ESTRUCTURA INTERNA PARA FICH 0
ESTRUCTURA INTERNA PARA FICH 2
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPES
PIPE System Callint pipe(int *filedes);
UNA PIPE PROPORCIONA UN FLUJO UNIDIRECCIONAL DE– UNA PIPE PROPORCIONA UN FLUJO UNIDIRECCIONAL DE DATOS
– LA LLAMADA AL SISTEMA “PIPE” RETORNA DOS DESCRIPTORES DE FICHERODESCRIPTORES DE FICHERO :
» “filedes[0]“ QUE ES ABIERTO PARA LECTURA Y » “filedes[1]” QUE ES ABIERTO PARA ESCRITURA
– UNA PIPE SE PUEDE UTILIZAR PARA LA COMUNICACIÓN ENTRE PROCESOS PADRE-HIJO
» EL PROCESO PADRE CREA UNA PIPE » EJECUTA UN FORK CREANDOSE UN PROCESO HIJO» EL PROCESO PADRE CIERRA EL DESCRIPTOR DE LECTURA» EL PROCESO HIJO CIERRA EL DESCRIPTOR DE ESCRITURA
LUIS MENGUAL (c)
» EL PROCESO HIJO CIERRA EL DESCRIPTOR DE ESCRITURA
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPES
main( ){
int pipefd[2]. n;h b ff[100]char buff[100];
if ( pipe (pipefd) < 0 ) {(“ ´t i ”)perror (“can t open pipe”);
}printf(“read fd= %d, write fd = %d\n”, pipefd[0], pipefd[1]);if (write(pipefd[1] “hello word\n” 12) != 12)if (write(pipefd[1], hello word\n , 12) != 12)
err_sys(“write error”);
if ( (n= read(pipefd[0] buff sizeof(buff) ) ) <= 0 )if ( (n= read(pipefd[0], buff, sizeof(buff) ) ) <= 0 )err_sys(“read error”);
write (1, buff, n); /* fd 1 = stdout */exit(0);
LUIS MENGUAL (c)
exit(0);}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPES
PROCESO PADRE PROCESO HIJOPROCESO PADRE PROCESO HIJO
WRITE fdREAD fd WRITE fdREAD fd
KERNELKERNEL
PIPE
FLUJO DE DATOS
LUIS MENGUAL (c)
FLUJO DE DATOS
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPES
main( )main( ){
int pipefd[2]. child;
if ( pipe (pipefd) < 0 ) {err_sys (“can´t open pipe”);exit( );exit( );
}if ( (child = fork( ) ) == -1)
err sys “fork”);err_sys fork );else if (child) { // PROCESO PADRE
char buf [1024 ];close (pipefd[1]);(p p [ ]);if (read(pipefd[0], buf, 1024) < 0)
err_sys (“reading message”);printf(“--> %s\n”, buf);
LUIS MENGUAL (c)
close(pipefd[0]);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPES
} else { // PROCESO HIJO} else { // PROCESO HIJO
l ( i fd[0])close (pipefd[0]);if (write(pipefd[1], DATA, sixeof(DATA) ) < 0)
err_sys (“writing message”);close(pipefd[1]);
}exit(0);( );
}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPES
PROCESO PADRE PROCESO HIJO
WRITE 1 fd WRITE 2 fd
READ 2 fd READ 1 fd
KERNEL
PIPE 1FLUJO DE DATOS
PIPE 2
FLUJO DE DATOS
LUIS MENGUAL (c)
FLUJO DE DATOS
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPESmain( )( ){
int childpid, pipe1fd[2], pipe2fd[2];
if ( pipe (pipe1fd) < 0 || pipe(pipe2fd)<0 ) err_sys (“can´t open pipes”);
if ( (child pid= fork( ) ) < 0 ) {err_sys (“can´t fork”);
} l if ( hild i > 0) { /* t */} else if (childpi > 0) { /* parent */close (pipe1fd[0]);close (pipe2fd[1]);client (pipe1fd[1] pipe2fd[0] );client (pipe1fd[1], pipe2fd[0] );while (wait ( (int*) 0) != childpid )close (pipe1fd[1]);close (pipe2fd[0]);
LUIS MENGUAL (c)
close (pipe2fd[0]);exit (0);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPES
{ else { /* child */close (pipe1fd[1]);close (pipe2fd[0);
server (pipe1fd[0], pipe2fd[1] );
close (pipe1fd[0]);close (pipe2fd[1]);
it (0)exit (0);}
}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPESPIPESPIPESPIPES
PROCESO h PROCESO t PROCESO lPROCESO who
WRITE 2 fd
PROCESO sort PROCESO lpr
WRITE 1 fd READ 2 fdREAD 1 fd
KERNELKERNEL
PIPE 1 PIPE 2FLUJO DE DATOS FLUJO DE DATOS
LUIS MENGUAL (c)
who | sort | lpr
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPES PIPES CC O SCC O SBIDIRECCIONALESBIDIRECCIONALES
SOCKETPAIR System Callint socketpair(int family int type int protocolint socketpair(int family, int type, int protocol, int sockvec[2])
– ESTA LLAMADA AL SISTEMA RETORNA DOS DESCRIPTORES DE SOCKET : sockvec[0] y sockvec[1]
– LOS DESCRIPTORES DE SOCKETS SON BIDIRECCIONALES
– A ESTOS SOCKETS DEL DOMINIO UNIX ORIENTADOS A CONEXION SE LES DENOMINA STREM PIPES
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPES PIPES CC O SCC O SBIDIRECCIONALESBIDIRECCIONALES
main( ){
int sockets[2], child;char buf[1024]if (sockpair(AF_UNIX, SOCK_STREAM, 0, sockets) {
perror(“opening stream socket pair”);exit(1);exit(1);
}if ( (child = fork( )) ==-1)
perror(“fork”);perror( fork );else if (child) { /* parent */
close(sockets[0];if (read sockets[1] buf 1024 0 < 0)if (read sockets[1], buf,1024, 0 < 0)
perror(“reading stream message ”);printf(“-->%s\n, buf);if ( it ( k t [1] DATA2 i f(DATA2) ) 0)
LUIS MENGUAL (c)
if (write(sockets[1], DATA2, sizeof(DATA2) ) < 0)perror(“writing stream socket pair”);
close (sockets[1]);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
PIPES PIPES CC O SCC O SBIDIRECCIONALESBIDIRECCIONALES
} else { /* child */close(sockets[1];close(sockets[1];if (write sockets[0], DATA1, sizeof(DATA1 < 0)
perror(“writing stream message ”);if (read sockets[0] buf 1024 0 < 0)if (read sockets[0], buf,1024, 0 < 0)
perror(“reading stream message”);printf(“-->%s\n, buf);
l ( k t [0])close (sockets[0]);}exit(0);
}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACES DE INTERFACES DE OG C OOG C OPROGRAMACIONPROGRAMACION
LOS ESTÁNDARES TCP/IP NO ESPECIFICAN LOS DETALLES DE COMO APLICACIONESLOS DETALLES DE COMO APLICACIONES SOFTWARE INTERACTÚAN CON EL PROTOCOLO TCP/IP
SE PUEDEN IMPLEMENTAR APLICACIONES TCP/IP USANDO DISTINTOS S.OCADA S O PUEDE OFRECER INTERFACES CADA S.O. PUEDE OFRECER INTERFACES DISTINTOS
LOS PROGRAMAS DE APLICACION PUEDEN LOS PROGRAMAS DE APLICACION PUEDEN NO SER PORTABLES DE UNAS MÁQUINAS A OTRAS
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACES DE INTERFACES DE OG C OOG C OPROGRAMACIONPROGRAMACION
EN LA PRÁCTICA SOLO EXISTEN POCOS INTERFACES PARA PROGRAMAS DE APLICACIÓN (APIs):
– INTERFACE SOCKETS : PARA S.O. UNIX DE BERKELEY 4.3BSD INTERFACE TLI : DEFINIDO POR AT&T COMO INTERFACE PARA EL UNIX SYSTEM V
– INTERFAZ WINDOWS SOCKETS: PARA S.O. WINDOWS– INTERFAZ SOCKETS EN JAVA: MULTIPLATAFORMA
FUNCIONALIDAD DE UN INTERFAZ:– RESERVAR RECURSOS PARA LA COMUNICACIÓN– ESPECIFICAR LOS PUNTOS DE COMUNICACIÓN LOCALES Y REMOTOS– INICIAR UNA CONEXIÓN (CLIENTE)– ESPERAR UNA CONEXIÓN ENTRANTE (SERVIDOR)– ENVIAR O RECIBIR DATOS– DETERMINAR CUANDO LLEGAN DATOS– TERMINAR UNA CONEXIÓN– ABORTAR LA COMUNICACIÓN
LUIS MENGUAL (c)
ABORTAR LA COMUNICACIÓN– MANEJAR CONDICIONES DE ERRORES– LIBERACIÓN DE RECURSOS CUANDO FINALIZA LA COMUNICACIÓN
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACES DE INTERFACES DE OG C OOG C OPROGRAMACIONPROGRAMACION
APLICACIÓN
SESIÓN
PRESENTACIÓNAPLICACIONES
TRANSPORTE
S S ÓAPI
SOCKETS
RED
TRANSPORTETCP / IP
FISICO
ENLACEINTERFAZ
RED
LUIS MENGUAL (c)
FISICO RED
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACES DE INTERFACES DE OG C OOG C OPROGRAMACIONPROGRAMACION
EN LA MAYORÍA DE LAS IMPLEMENTACIONES EL PROTOCOLO SOFTWARE TCP/IP RESIDE EN EL S OPROTOCOLO SOFTWARE TCP/IP RESIDE EN EL S.O.
LOS PROGRAMAS DE APLICACIÓN INTERACTÚAN CON TCP/IP CON LLAMADAS AL SISTEMA
SE UTILIZARAN LAS PRIMITIVAS CONVENCIONALES E/S DE UNIX Y SE INCLUIRÁN OTRAS NUEVAS
– SE EXTENDERÁ EL CONJUNTO DE DESCRIPTORES DE FICHEROS CREANDO FICHEROS PARA COMUNICACIONES DE RED
– SE EXTENDERÁ EL USO DE LAS LLAMADAS AL SISTEMA WRITE Y READ A LOS NUEVOS DESCRIPTORES DE COMUNICACIONES
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACES DE INTERFACES DE OG C OOG C OPROGRAMACIONPROGRAMACION
APLICACIÓN 1 APLICACIÓN 2 APLICACIÓN N APLICACIONES
FUNCIONES DEL SISTEMA LLAMADAS POR LAS APLICACIONESINTERFAZ DE LLAMADAS AL
SISTEMA OPERATIVO CONTENIENDO
SISTEMA
PROTOCOLOSISTEMA OPERATIVO CONTENIENDO EL PROTOCOLO SOFTWARE TCP/IP
PROTOCOLOSOFTWARE
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
EL INTERFACE SOCKETS DE BERKELEY PROPORCIONA UNA SERIE DE FUNCIONES EN CODIGO C QUE IMPLEMENTAN LAS COMUNICACIONES DE RED PUDIENDO USAR VARIOSCOMUNICACIONES DE RED PUDIENDO USAR VARIOS PROTOCOLOS
UN SOCKET COMO UN FICHERO ES IDENTIFICADO POR UN DESCRIPTORDESCRIPTOR
UNIX LOCALIZA LOS DESCRIPTORES DE SOCKETS EN LA MISMA TABLA DE DESCRIPTORES DE FICHEROS
– UNA APLICACIÓN NO PUEDE TENER UN DESCRIPTOR DE FICHERO Y DE SOCKETS CON EL MISMO VALOR
UNIX BSD CONTIENE LA FUNCIÓN “SOCKET” PARA CREAR UN ÓSOCKET SIMILAR A LA FUNCIÓN OPEN PARA CREAR UN
DESCRIPTORES DE FICHEROS
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACEINTERFACESOC SSOC SSOCKETSSOCKETS
CUANDO UNA APLICACIÓN LLAMA A LA FUNCIÓN SOCKET EL S O CUANDO UNA APLICACIÓN LLAMA A LA FUNCIÓN SOCKET EL S.O. CREA UNA ESTRUCTURA DE DATOS CON PARTE DE LA INFORMACIÓN NECESARIA PARA LA COMUNICACIÓN Y CREA UN PUNTERO A ESA ESTRUCTURA DE DATOS EN LA TABLA DE DESCRIPTORESESTRUCTURA DE DATOS EN LA TABLA DE DESCRIPTORES
DESPUÉS DE CREAR EL SOCKET LA APLICACIÓN HACE MAS LLAMADAS AL SISTEMA PARA COMPLETAR LA INFORMACIÓN QUE NECESITA EL SOCKET PARA ESTABLECER UNA COMUNICACIÓN
TABLA DE DESCRIPTORES UNA POR PROCESO
ESTRUCTURA DATOS PARA SOCKETESTRUCTURA DATOS PARA SOCKET
FAMILIA : PF_INET
SERVICIO: SOCK STREAMSERVICIO: SOCK_STREAMLOCAL IP:
REMOTO IPPUERTO LOCAL:
LUIS MENGUAL (c)
REMOTO IP:PUERTO REMOTO :
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACEINTERFACESOC SSOC SSOCKETSSOCKETS
PARA DEFINIR UN PUNTO EXTREMO DE CONEXIÓN TCP/IP USA LA SIGUIENTE ESTRUCTURA DEFINIDA EN <netinet/in.h>
struct sockaddr {short sin family; /* familia AF xxx*/
t t k dd i {
short sin_family; / familia AF_xxx /char sa_data[14]; /*14 bytes de diireccion
} especifica de protocolo*/struct sockaddr_in {
short sin_family; /*AF_INET*/u_short sin_port; /*16-bits port number*/
/*network byte ordered*/struct in_addr sin_addr; /*32-bits hostid*/
/*network byte ordered*/ychar sin_zero[8] /*unused*/
}; struct in addr {
LUIS MENGUAL (c)
struct in_addr {u_long s_addr;
} ;
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINSOCK2.HWINSOCK2.HEstructura Estructura sockaddr_insockaddr_in
struct sockaddr_in {short sin_family;u short sin port;u_short sin_port;struct in_addr sin_addr;char sin zero[8];char sin_zero[8];
};
t t i dd {struct in_addr {union {
struct { u char s b1 s b2 s b3 s b4; } S un b;struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;struct { u_short s_w1,s_w2; } S_un_w;u_long S_addr;
LUIS MENGUAL (c)
} S_un;#define s_addr S_un.S_addr
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACEINTERFACESOC SSOC SSOCKETSSOCKETS
SOCKET System Call:int socket(int family, int type, int protocol)
LA FAMILIA PUEDE SER:– LA FAMILIA PUEDE SER:» AF_UNIX : Protocolos Unix » AF_INET: Protocolos de Internet» AF_NS: Protocolos Xerox NS » AF_IMPLINK: IMP (Interface Message Processor)
– EL TIPO DE SOCKET PUEDE SER:EL TIPO DE SOCKET PUEDE SER:» SOCK_STREAM : Orientado a bytes» SOCK_DGRAM: Orientado a datagrama
SOCK RAW O i t d j» SOCK_RAW: Orientado a mensajes» SOCK_SEQPACKET: Orientado a paquetes secuenciados» SOCK_RDM: Orientado a paquetes no secuenciados
LUIS MENGUAL (c)
– EL ARGUMENTO PROTOCOLO ES DE VALOR “0” EN LA MAYORÍA DE LAS APLICACIONES
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACEINTERFACESOC SSOC S
SOCKET System Call:
SOCKETSSOCKETS SOCKET System Call:
int socket(int family, int type, int protocol)– NO TODAS LAS COMBINACIONES DE FAMILIAS Y TIPOS SON
VALIDASVALIDAS
SOCK_STREAMAF_UNIX AF_ INET AF_NS
SS
TCPUDP
SPPIDPSOCK_DGRAM
SOCK_RAWSOCK_SEQPACKET
S UDPIP
IDPS
SPP
– LA LLAMADA AL SISTEMA SOCKET DEVUELVE UN ENTERO QUE ES EL DESCRIPTOR DE SOCKET. SI OCURRE UN ERROR DEVUELVE EL VALOR -1. LAS CAUSA DE EROR PUEDEN SER:
» TABLA DE DESCRIPTORES LLENA» PERMISO DENEGADO PARA CREAR UN SOCKET
LUIS MENGUAL (c)
» PERMISO DENEGADO PARA CREAR UN SOCKET» EL SISTEMA NO TIENE ESPACIO EN BUFFER DISPONIBLE» ERROR EN LOS PARÁMETROS
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACEINTERFACESOCKETSSOCKETSSOCKETSSOCKETS
ASOCIACIÓN:
[Proto., Dir. IP Local, Pto. Local, Dir. IP Remota, Pto. Remoto]
MEDIA ASOCIACIÓN ( t t k dd i )MEDIA-ASOCIACIÓN (struct sockaddr_in):
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACEINTERFACESOC SSOC SSOCKETSSOCKETS
protocoloprotocolo proc_localproc_local proc_remotoproc_remotodir_localdir_local dir_remotodir_remoto
idid socket()
k t()
bind() listen(), accept()
t()
servidor servidor orientado conexionorientado conexion
clientecliente socket()
socket()
connect()
bind() recvfrom()
cliente cliente orientado conexionorientado conexion
servidor servidor socket()
socket()
bind()
bind()
recvfrom()
sendto()
no orientado conexionno orientado conexion
cliente cliente no orientado conexionno orientado conexionno orientado conexionno orientado conexion
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
CONNECT System Callint connect(int sockfd, struct sockaddr *servaddr, int addrlen);
– “Sockfd“ ES EL DESCRIPTOR DEL SOCKET DEVUELTO POR LA LLAMADA ALSockfd ES EL DESCRIPTOR DEL SOCKET DEVUELTO POR LA LLAMADA AL SISTEMA “SOCKET”
– “Servaddr” ES UN PUNTERO A UNA ESTRUCTURA “Sockaddr_in” QUE CONTIENE EL NÚMERO IP Y EL PUERTO DE LA MÁQUINA Y APLICACIÓN REMOTAS“Addrlen” ES LA LONGITUD DEL ARGUMENTO ANTERIOR– Addrlen ES LA LONGITUD DEL ARGUMENTO ANTERIOR
–– CONNECTCONNECT ELIGE UN NÚMERO IP Y DE PUERTO LOCAL PARA EL SOCKET–– CONNECTCONNECT RETORNA EL VALOR “0” SI HA TENIDO EXITO EN EL
ESTABLECIMIENTO DE LA CONEXIÓN CON LA APLICACIÓN REMOTA Y EL VALOR “-1” SI HA OCURRIDO UN ERROR. CAUSAS DE ERROR:
» EXPIRÓ UN TIMEOUT SIN ESTABLECER CONEXIÓN (TCP)» CONEXIÓN RECHAZADA POR MÁQUINA REMOTA (TCP)» PARÁMETROS INVÁLIDOS» PARÁMETROS INVÁLIDOS» APLICACIÓN REMOTA NO DISPONIBLE ............
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
WRITE System Callint write(int sockfd, char *buff, unsigned int bufflen );
– “Sockfd” ES EL DESCRIPTOR DEL SOCKET AL CUAL SE DEBERÍAN MANDAR LOS DATOSLOS DATOS
– “Buff” ES UN PUNTERO QUE TIENE LA DIRECIÓN DONDE SE ENCUENTRAN LOS DATOS A ENVIAR
– “Bufflen” ES EL NÚMERO DE BYTES A ENVIAR EN “Buff”–– WRITE WRITE RETORNA EL NÚMERO DE BYTES ESCRITOS EN EL SOCKET
NORMALMENTE IGUAL A “Buflen”. SI FUERA INFERIOR A ESTE VALOR NO SERIA UN ERROR SINO SERÍA DEBIDO A UNA CONGESTIÓN EN LA RED
–– WRITEWRITE RETORNA EL VALOR “-1 “ SI SE PRODUCE UN ERROR:–– WRITE WRITE RETORNA EL VALOR -1 SI SE PRODUCE UN ERROR:» LOS DATOS ESCRITOS EXCEDEN LA CAPACIDAD DEL SISTEMA» INTENTO DE ESCRIBIR EN UN SOCKET STREAM NO CONECTADO» PARÁMETROS INVÁLIDOS» ERROR DE E/S
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
READ System Callyint read(int sockfd, char *buff, unsigned int bufflen );
– “Sockfd” ES EL DESCRIPTOR DEL SOCKET DEL CUAL SE DEBERÍAN LEER LOS DATOS“B ff” ES UN PUNTERO QUE TIENE LA DIRECIÓN DONDE SE ALMACENARÁN– “Buff” ES UN PUNTERO QUE TIENE LA DIRECIÓN DONDE SE ALMACENARÁN LOS DATOS RECIBIDOS
– “Bufflen” ES EL NÚMERO DE BYTES EN “Buff”– SI NO LLEGAN DATOS AL SOCKET READ SE BLOQUEASI NO LLEGAN DATOS AL SOCKET READ SE BLOQUEA– SI LLEGAN MAS DATOS QU E EL TAMAÑO DEFINIDO EN EL BUFFER READ READ
SOLO EXTRAERÁ AQUELLOS HASTA LLENAR EL BUFFER– SI READ READ TIENE ÉXITO RETORNA EL NÚMERO DE BYTES LEÍDOS QUE PUEDE
SER MENOR QUE “bufflen” O EL VALOR “0” SI SE DETECTA EL CIERRE DELSER MENOR QUE bufflen O EL VALOR 0 SI SE DETECTA EL CIERRE DEL SOCKET
–– READ READ RETORNA EL VALOR “-1 “ SI SE PRODUCE UN ERROR:– PARÁMETROS INVÁLIDOS– ERROR DE E/S
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
SEND System Callint send(int sockfd, char *buff, int buflen, int flags);
“Sockfd” ES EL DESCRIPTOR DEL SOCKET AL CUAL SE DEBERIAN– Sockfd ES EL DESCRIPTOR DEL SOCKET AL CUAL SE DEBERIAN MANDAR LOS DATOS
– “Buff” TIENE LA DIRECIÓN DONDE SE ENCUENTRAN LOS DATOS A ENVIARENVIAR
– “Bufflen” ES EL NÚMERO DE BYTES EN “Buff”– “flags” SON BITS DE CONTROL QUE ESPECIFICAN DATOS FUERA DE
BANDA O MENSAJESBANDA O MENSAJES– SEND RETORNA EL NÚMERO DE BYTES ENVIADOS O RETORNA EL
VALOR “-1 “ SI SE PRODUCE UN ERROR
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
RECV System Callint recvf (int sockfd, char *buff, int buflen, int flags);
“Sockfd” ES EL DESCRIPTOR DEL SOCKET DEL CUAL SE DEBERÍAN– Sockfd ES EL DESCRIPTOR DEL SOCKET DEL CUAL SE DEBERÍAN LEER LOS DATOS
– “Buff” TIENE LA DIRECIÓN DONDE SE ALMACENARÁN LOS DATOS RECIBIDOSRECIBIDOS
– “Bufflen” ES EL NÚMERO DE BYTES EN “Buff”– “flags” SON BITS DE CONTROL QUE ESPECIFICAN DATOS FUERA DE
BANDA O MENSAJESBANDA O MENSAJES– “RECV” RETORNA EL NÚMERO DE BYTES RECIBIDOS O RETORNA EL
VALOR “-1 “ SI SE PRODUCE UN ERROR
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
SENDTO System Callint sendto (int sockfd, char *buff, int buflen, int flags, struct sockaddr *to, int addrlen);, );
– “Sockfd” ES EL DESCRIPTOR DEL SOCKET AL CUAL SE DEBERIAN MANDAR LOS DATOS
– “Buff” TIENE LA DIRECIÓN DONDE SE ENCUENTRAN LOS DATOS A ENVIAR“B ffl ” ES EL NÍMERO DE BYTES EN “B ff”– “Bufflen” ES EL NÍMERO DE BYTES EN “Buff”
– “flags” SON BITS DE CONTROL QUE ESPECIFICAN DATOS FUERA DE BANDA O MENSAJES
– “TO” ES UN PUNTERO A LA ESTRUCTURA DE LA DIRECCIÓN DE LATO ES UN PUNTERO A LA ESTRUCTURA DE LA DIRECCIÓN DE LA MÁQUINA REMOTA
– “Addrlen” ES LA LONGITUD DE LA DIRECCIÓN “to” EN BYTES– SENTO RETORNA EL NÚMERO DE BYTES ENVIADOS O RETORNA EL VALOR
“ 1 “ SI SE PRODUCE UN ERROR-1 SI SE PRODUCE UN ERROR
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
RECVFROM System Callint recvfrom (int sockfd, char *buff, int buflen, int flags, struct sockaddr *from, int *addrlen);
“Sockfd” ES EL DESCRIPTOR DEL SOCKET DEL CUAL SE DEBERÍAN LEER LOS– “Sockfd” ES EL DESCRIPTOR DEL SOCKET DEL CUAL SE DEBERÍAN LEER LOS DATOS
– “Buff” TIENE LA DIRECIÓN DONDE SE ALMACENARAN LOS DATOS RECIBIDOS– “Bufflen” ES EL NÚMERO DE BYTES EN “Buff”– “flags” SON BITS DE CONTROL QUE ESPECIFICAN DATOS FUERA DE BANDA O
MENSAJES– “From” ES UN PUNTERO EN EL QUE SE RETORNA LA DIRECCIÓN DE LA
MÁQUINA REMOTAMÁQUINA REMOTA– “Addrlen” ES UN PUNTERO A LA LONGITUD DEL CAMPO “from”– RECVFROM RETORNA “0” o el VALOR “-1 “ SI SE PRODUCE UN ERROR
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
BIND System Callint bind(int sockfd, struct sockaddr *myaddr, int addrlen);addrlen);
– “Sockfd“ ES EL DESCRIPTOR DEL SOCKET DEVUELTO POR LA LLAMADA AL SISTEMA “SOCKET” “S k dd ” ES UN PUNTERO A UNA ESTRUCTURA “S k dd i ”– “Sockaddr” ES UN PUNTERO A UNA ESTRUCTURA “Sockaddr_in” . LA LLAMADA AL SISTEMA BIND BIND ASIGNA UN NÚMERO IP Y UN NÚMERO DE PUERTO LOCAL A ESTA ESTRUCTURA“Addrlen” ES LA LONGITUD DEL ARGUMENTO ANTERIOR– Addrlen” ES LA LONGITUD DEL ARGUMENTO ANTERIOR
–– BIND BIND RETORNA EL VALOR “0” SI HA TENIDO EXITO O EL VALOR “-1” SI HA OCURRIDO UN ERROR. CAUSAS DE ERROR:
EL SOCKET YA TIENE PUERTO Y NÚMERO IP ASIGNADO» EL SOCKET YA TIENE PUERTO Y NÚMERO IP ASIGNADO» EL NÚMERO IP DEFINIDO NO CORRESPONDE A UN INTERFAZ
LOCALÓ
LUIS MENGUAL (c)
» EL PROGRAMA DE APLICACIÓN NO TIENE PERMISO PARA UTILIZAR ESE NÚMERO DE PUERTO...............
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
LISTEN System Callint listen(int sockfd, int backlog);
“Sockfd“ ES EL DESCRIPTOR DEL SOCKET DEVUELTO POR LA– Sockfd ES EL DESCRIPTOR DEL SOCKET DEVUELTO POR LA LLAMADA AL SISTEMA “SOCKET”
– “backlog” ESPECIFICA CUANTAS PETICIONES DE CONEXION PUEDEN SER ENCOLADAS POR EL SISTEMA ESTE VALOR SUELEPUEDEN SER ENCOLADAS POR EL SISTEMA. ESTE VALOR SUELE SER TÍPICAMNETE DE 5
–– LISTEN LISTEN SE EJECUTA EN UN SERVIDOR DESPUÉS DE LAS LLAMADAS SOCKET Y A BINDSOCKET Y A BINDSOCKET Y A BINDSOCKET Y A BIND
– LISTEN RETORNA EL VALOR “0” SI HA TENIDO ÉXITO O EL VALOR “-1” SI HA OCURRIDO UN ERROR. CAUSAS DE ERROR:
» PARÁMETRO INVÁLIDO» PARÁMETRO INVÁLIDO» EL TIPO DE SOCKET NO SOPORTA LISTEN
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
ACCEPT System Callint accept(int sockfd, struct sockaddr *peer, int *addrlen);
– “Sockfd“ ES EL DESCRIPTOR DEL SOCKET DEVUELTO POR LA LLAMADA AL SISTEMA “SOCKET”
– “perr” ES UN PUNTERO A UNA ESTRUCTURA “Sockaddr_in” EN EL QUE SE RETORNA EL NÚMERO IP Y EL PUERTO DE LA MÁQUINA Y APLICACIÓN REMOTAS
– “Addrlen” ES UN PUNTERO A UN ENTEROQUE INICIALMENTE ESPECIFICA ELAddrlen ES UN PUNTERO A UN ENTEROQUE INICIALMENTE ESPECIFICA EL TAMAÑO DEL ARGUMENTO ANTERIOR. CUANDO RETORNA LA LLAMADA ESPECIFICA EL NÚMERO DE BYTES ALMACENADOS
– ACCEPT TOMA LA PRIMERA PETICIÓN EN LA COLA Y CREA OTRO SOCKET CON LAS MISMAS PROPIEDADES QUE “ kfd”CON LAS MISMAS PROPIEDADES QUE “sockfd”
– SI NO HAY PETICIONES DE CONEXIÓN PENDIENTES SE BLOQUEA– ACEPT RETORNA TRES VALORES : UN ENTERO QUE ES EL DESCRIPTOR DE
UN NUEVO SOCKET O UNA INDICACIÓN DE ERROR ( 1) LA DIRECCIÓN DELUN NUEVO SOCKET O UNA INDICACIÓN DE ERROR (-1), LA DIRECCIÓN DEL PROCESO CLIENTE Y LA LONGITUD DE ESTA DIRECCIÓN
– CUASA DE ERROR:» EL SOCKET NO ES DEL TIPO SOCK STREAM
LUIS MENGUAL (c)
» EL SOCKET NO ES DEL TIPO SOCK_STREAM» PARÁMETROS INVÁLIDOS
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
int sockfd, newsockfd;if ( (sockfd=socket( ......)) < 0)
err_sys(“socket error”);if ( (bind(sockfd, ......) < 0)( ( ( ) )
err_sys(“bind error”);if ( (listen(sockfd, 5) < 0)
err sys(“socket error”);err_sys( socket error );for ( ; ; ) {
newsockfd = accept(sockfd, .....); /* se bloquea */if (newsockfd < 0)if (newsockfd < 0)
err_sys(“accept error”);if (fork( ) == 0) { /* hijo */
close (sockfd)close (sockfd) doit(newsockfd) /* procesa la peticion */ exit(0)
}
LUIS MENGUAL (c)
}close (newsockfd); /* padre */
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
CLOSE System Calli t l (i t kfd)int close (int sockfd) ;
– “Sockfd“ ES EL DESCRIPTOR DEL SOCKEt– CLOSE CIERRA EL SOCKETCLOSE CIERRA EL SOCKET– SI EL SOCKET QUE SE VA A CERRAR ESTA ASOCIADO CON UN
PROTOCOLO ORIENTADO A CONEXIÓN (TCP,SPP) EL SISTEMA DEBE ASEGURARSE QUE CUALQUIER DATO DENTRO DEL KERNEL QUE Q Q QTODAVÍA NO HA SIDO TRANSMITIDO O RECONOCIDO ES ENVIADO
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
LLAMADAS AL SISTEMA UTILIZANDO UN PROTOCOLO ORIENTADO A CONEXIÓN
socket( )SERVIDOR
socket( )
bind( )
listen( )
CLIENTE
socket( ) listen( )
connect( )ESTABLECIMIENTO CONEXIÓN accept( )
connect( )
write( ) DATOS (PETICIÓN)read( )
BLOQUEO HASTA RECIBIRCONEXION DE CLIENTE
DATOS (RESPUESTA) write( )read( )
read( )PROCESAMIENTO
PETICION
LUIS MENGUAL (c)close( ) close( )
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
LLAMADAS AL SISTEMA UTILIZANDO UN PROTOCOLO NO ORIENTADO A CONEXIÓNSOCKETS NO CONECTADOSSOCKETS NO CONECTADOS
socket( )
SERVIDOR
socket( )
bind( )socket( )CLIENTE
bind( )
recvfrom( )bind( )
sendto( )DATOS (PETICION)
BLOQUEO
recvfrom( )
( )
DATOS (RESPUESTA) sendto( )
PROCESAMIENTOPETICION
BLOQUEO
LUIS MENGUAL (c)
recvfrom( ) ( )
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
LLAMADAS AL SISTEMA UTILIZANDO UN PROTOCOLO NO ORIENTADO A CONEXIÓNSOCKETS CONECTADOS EN CLIENTE
socket( )SERVIDOR
socket( )
socket( )
bind( )CLIENTE
socket( )
connect( )
bind( )
recvfrom( )
DATOS (PETICION)
connect( )BLOQUEO
write()d()
DATOS (RESPUESTA)read( )
BLOQUEO
sendto( )
PROCESAMIENTOPETICION
send()
LUIS MENGUAL (c)
read( )recv()
( )
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARE SOFTWARE CCCLIENTECLIENTE
UN CLIENTE DEBE ESPECIFICAR EL NÚMERO IP Y EL NÚMERO DE PUERTO DENÚMERO IP Y EL NÚMERO DE PUERTO DE UN SERVIDOR USANDO LA ESTRUCTURA sockaddr_in
– PARA ELLO UTILIZARA LAS LLAMADAS AL SISTEMA GETHOSTBYNAME Y GETSERVBYNAME
LOCALMENTE AL CLIENTE SE LE ASIGNALOCALMENTE AL CLIENTE SE LE ASIGNA UN NÚMERO IP Y UN NÚMERO DE PUERTO
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARE SOFTWARE CCCLIENTECLIENTE
CLIENTE TCP CLIENTE TCP (ALGORITMO):):– BÚSQUEDA DE LA DIRECCIÓN IP Y DEL NÚMERO DE– BÚSQUEDA DE LA DIRECCIÓN IP Y DEL NÚMERO DE
PUERTO DEL SERVIDOR– ABRE UN SOCKET
ESPECIFICA QUE LA CONEXION NECESITA UN PUERTO– ESPECIFICA QUE LA CONEXION NECESITA UN PUERTO EN LA MÁQUINA LOCAL Y PERMITE QUE TCP ELIJA UNOCONECTA EL SOCKET AL SERVIDOR– CONECTA EL SOCKET AL SERVIDOR
– SE COMUNICA CON EL SERVIDOR USANDO EL PROTOCOLO TCP (QUE IMPLICA EL ENVIO DE PETICIONES Y LA ESPERA DE RECONOCIMIENTOS)PETICIONES Y LA ESPERA DE RECONOCIMIENTOS)
– HAY QUE HACER REPETIDAS LLAMADAS A READ– CIERRA LA CONEXIÓN
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARE SOFTWARE CCCLIENTECLIENTE
CLIENTE UDP CLIENTE UDP (ALGORITMO)::– BÚQUEDA DE LA DIRECCION IP Y DEL NUMERO DE– BÚQUEDA DE LA DIRECCION IP Y DEL NUMERO DE
PUERTO DEL SERVIDOR– ABRE UN SOCKET
ESPECIFICA QUE LA CONEXION NECESITA UN PUERTO– ESPECIFICA QUE LA CONEXION NECESITA UN PUERTO EN LA MÁQUINA LOCAL Y PERMITE QUE UDP ELIJA UNOESPECIFICA EL SERVIDOR AL CUAL SE VAN A MANDAR– ESPECIFICA EL SERVIDOR AL CUAL SE VAN A MANDAR LOS MENSAJES
– SE COMUNICA CON EL SERVIDOR USANDO EL PROTOCOLO UDPPROTOCOLO UDP
– NO ES NECESARIO HACER REPETIDAS LLAMADAS A READ PARA OBTENER UN MENSAJECIERRA LA CONEXIÓN
LUIS MENGUAL (c)
– CIERRA LA CONEXIÓN
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARE SOFTWARE CCCLIENTECLIENTE
CLIENTE UDPCLIENTE UDP– LAS APLIACIONES CLIENTES UDP PUEDEN UTILIZAR– LAS APLIACIONES CLIENTES UDP PUEDEN UTILIZAR
SOCKETS CONECTADOS O SOCKETS NO CONECTADOS» CUANDO SE UTILIZAN SOCKETS CONECTADOS
– LA LLAMADA ALSISTEMA CONNECT( ) LO ÚNICO QUE HACE ES– LA LLAMADA ALSISTEMA CONNECT( ) LO ÚNICO QUE HACE ES ALMACENAR LA DIRECCIÓN DE LA MÁQUIINA REMOTA
– CONNECT RETORNA INMEDIATAMENTE SIN INTERCAMBIAR NINGÚN MENSAJE CON LA MÁQUINA REMOTASOLO ES NECESARIO ESPECIFICAR UNA VEZ LA DIRECCIÓN DE LA– SOLO ES NECESARIO ESPECIFICAR UNA VEZ LA DIRECCIÓN DE LA MÁQUINA REMOTA
» CUANDO SE UTILIZAN SOCKETS NO CONECTADOS– ES NECESARIO ESPECIFICAR LA DIRECCIÓN DEL SERVIDOR CADAES NECESARIO ESPECIFICAR LA DIRECCIÓN DEL SERVIDOR CADA
VEZ QUE SE MANDA UN MENSAJE
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARE SOFTWARE CC
GETHOSTBYNAME System Call
CLIENTECLIENTE GETHOSTBYNAME System Call
struct hostent *gethostbyname(char * hostname)– GETHOSTBYNAME RETORNA UN PUNTERO A UNA
ESTRUCTURA “hostent” O A UN PUNTERO NULO SI HA OCURRIDO UN ERROR
– GETHOSTBYNAME OBTIENE EL NUMERO IP A PARTIR DEL NOMBRE DE MAQUINANOMBRE DE MAQUINA
struct hostent {h *h /* b fi i l d h t */char *h_name; /* nombre oficial de host */
char **h_aliases; /* lista de alias */int h_addrtype; /* familia */int h_lenght; /* longitud de direccion */char **h_addr_list; /* lista de direcciones*/
};
LUIS MENGUAL (c)
}
# define h_addr h_addr_list[0]
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARE SOFTWARE CCCLIENTECLIENTE
GETSERVBYNAME System Call struct servent *getservtbyname(char * servname, char *protname)char *protname)
– GETSERVBYNAME RETORNA UN PUNTERO A UNA ESTRUCTURA “servent” O A UN PUNTERO NULO SI HA OCURRIDO UN ERROROCURRIDO UN ERROR
– GETSERVBYNAME OBTIENE ELNUMERO DE PUERTO A PARTIR DEL SERVICIO Y EL PROTOCOLO
struct servent {char *s name; /* nombre oficial de servicio */char s_name; / nombre oficial de servicio /char **s_aliases; /* lista de alias */short s_port; /* numero de puerto, orden bytes red */char *s proto; /* protocolo */
LUIS MENGUAL (c)
char *s_proto; /* protocolo */};
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARE SOFTWARE CCCLIENTECLIENTE
GETPROTOBYNAME System Call struct protoent *getprotobyname(char *protname)p g p y ( p )
– GETPROTOBYNAME RETORNA UN PUNTERO A UNA ESTRUCTURA “protent” O A UN PUNTERO NULO SI HA OCURRIDO UN ERROR
– GETPROTOBYNAME OBTIENE ELNUMERO DE PROTOCOLO A PARTIR DEL NOMBRE
struct protoent{char *p_name; /* nombre oficial del protocolo */char **p_aliases; /* lista de alias pra el protocolo*/int *p_proto; /* numero oficial del protocolo */
};
LUIS MENGUAL (c)
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSO CSO CSOFTWARE CLIENTESOFTWARE CLIENTE
SE PUEDEN IMPLEMENTAR DOS PROCEDIMIENTOS SE PUEDEN IMPLEMENTAR DOS PROCEDIMIENTOS QUE MANEJEN LA CONEXION DE UN SOCKET:
socket = connectTCP (host, service)socket = connectUDP (host,service)
int connectTCP(host, service)char *host; /* nombre del servidor */char host; / nombre del servidor /char *service; /* nobre del servicio */
{return connectsock (host,service,”tcp”)return connectsock (host,service, tcp )
}
int connectUDP(host, service)( , )char *host; /* nombre del servidor */char *service; /* nobre del servicio */
{
LUIS MENGUAL (c)
return connectsock (host,service,”udp”)}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSO CSO C
EL PROCEDIMIENTO “connectsock” realiza la CONEXION SOFTWARE CLIENTESOFTWARE CLIENTE
DE UN SOCKET . LA LLAMADA A ESTE PROCEDIMIENTO ESPECIFICA SI ES UN SOCKET TCP O UDP
/* connectsock conecta un socket tcp o udp *//* connectsock - conecta un socket tcp o udp */
#include <sys/types.h>#i l d < / k t h>#include <sys/socket.h>#include <netinet/in.h>#include<netdb.h>extern int errno;extern char *sys_errlist[];u_short htons( );_ ( );int connectsock (host, service, protocol)char *host /* nombre del host servidor */
LUIS MENGUAL (c)
char host / nombre del host servidor /char *service /* nombre del servicio */char *protocol /* protocolo en uso: tcp oudp*/
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSO CSO CSOFTWARE CLIENTESOFTWARE CLIENTE
/* connectsock - conecta un socket tcp o udp */{struct hostent *phe; /* puntero a estructura hostent */struct servent *pse; /* puntero a estructura servent */struct protoent *ppe; /* puntero a estructura protoent */struct sockaddr_in sin; /* estructura punto extremo conexion */int s, type; /* descriptor y tipo de socket */int s, type; / descriptor y tipo de socket /
bzero((char *)&sin, sizeof(sin));sin sin family=AF INET;sin.sin_family=AF_INET;
/* obtiene el nº de puerto a partir del nombre del servicio y lo almacena en la estructura */almacena en la estructura */if ( pse=getserverbyname(service, protocol) )
sin.sin_port = pse -->s_port;l if ( ( i i t ht ( ( h t) t i ( i ))) 0)
LUIS MENGUAL (c)
else if ( (sin.sin_port = htons( (u_short) atoi (service))) == 0)errexit(“can´t get \”%s\” service entry\n”, service);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSO CSO CSOFTWARE CLIENTESOFTWARE CLIENTE
/* mapea el nombre de la maquina a una direccion IP y la almacenaen la estructura */
if ( phe=gethostbyname(host) )( g y ( ) )bcopy(phe-->h_addr, (char *)&sin.sin_addr, phe-->h_length);
else if ( (sin.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)errexit(“can´t gat \”%s\” host entry\n”, host);errexit( can t gat \ %s\ host entry\n , host);
/* mapea el nombre de protocolo al numero oficiall */if ( (ppe= getprotobyname(protocol)) == 0)if ( (ppe= getprotobyname(protocol)) == 0)
errexit(“can´t gat \”%s\” protocol entry\n”, protocol);
/* se elige el tipo de socket *//* se elige el tipo de socket */if (strcmp(protocol, “udp”) == 0)
type = SOCK_DGRAM;l
LUIS MENGUAL (c)
elsetype = SOCK_STREAM;
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
/* abre el socket */s= socket(PF_INET, type, ppe-->p_proto);if (s<0)( )
errexit(“can´t create socket: %s\n”, sys_errlist[errno]);
/* conecta el socket *// conecta el socket /if ( connect(s, (struct sockaddr *)&sin, sizeof(sin)) < 0 )
errexit(“can´t connect to %s\ %s: %s\n”, host, service, sys errlist[errno]);sys_errlist[errno]);
return s;
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO DAYTIME (Pto.13)IMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO DAYTIME (Pto.13)( )( )/* cliente tcp para el servicio daytime */intmain(argc argv)main(argc, argv)int argc;char *argv[ ];{{
char *host = “localhost”;char *service = “daytime”;swich (argc) {( g ) {case 1:
host = “localhost”;break;
case 3:service = argv[2]
case 2:
LUIS MENGUAL (c)
host = argv[1];break;
default
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO DAYTIMEIMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO DAYTIME
fprint(stderr, “usage: TCPdaytime[host[port]]\n”);exit(1);
}}TCPdaytime(host, service);exit(0);
}}
TCPdaytime (host, service)char *host;;char *service;{
char buf[LINELEN+1];int s,n;s = connectTCP (host, service);while ( (n = read(s, buf, LINELEN ) ) > 0 {
LUIS MENGUAL (c)
buf[n] = “\0”;(void) fputs (buf, stdout);
} }
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO ECHO IMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO ECHO ((Pto.7)Pto.7)
/* cliente tcp para el servicio echo */intmain(argc argv)main(argc, argv)int argc;char *argv[ ];{{
char *host = “localhost”;char *service = “echo”;swich (argc) {( g ) {case 1:
host = “localhost”;break;
case 3:service = argv[2]
case 2:
LUIS MENGUAL (c)
host = argv[1];break;
default
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO ECHOIMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO ECHOfprint(stderr, “usage: TCPecho[host[port]]\n”);exit(1);
}}TCPecho(host, service);exit(0);
}intTCPecho (host, service)char *host;char *service;{ char buf[LINELEN+1];
int s,n;i t t h i hint outchars, inchars;s = connectTCP (host, service);while (fgets( buf, sizeof(buf), stdin ) ) {
buf[LINELEN] = “\0”;
LUIS MENGUAL (c)
buf[LINELEN] = “\0”;outchars = starlen(buf);(void) write (s, buf, outchars);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO ECHOIMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO ECHOIMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO ECHOIMPLEMENTACIÓN DE UN CLIENTE TCP PARA EL SERVICIO ECHO
for (inchars=0; inchars < outchars; inchars+=n ) {n = read (s, &buf[inchars], outchars - inchars);if (n < 0)
errexit (“socket read failed: %s\n”, sys_errlist[errno] );}}fputs (buf, stdout);}
}}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACION
IMPLEMENTACION DE UN CLIENTE UDP PARA EL SERVICIO ECHOIMPLEMENTACION DE UN CLIENTE UDP PARA EL SERVICIO ECHO
SOFTWARE CLIENTESOFTWARE CLIENTE
/* cliente udp para el servicio echo */intmain(argc argv)main(argc, argv)int argc;char *argv[ ];{{
char *host = “localhost”;char *service = “echo”;swich (argc) {( g ) {case 1:
host = “localhost”;break;
case 3:service = argv[2]
case 2:
LUIS MENGUAL (c)
host = argv[1];break;
default
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACIÓN DE UN CLIENTE UDP PARA EL SERVICIO ECHOIMPLEMENTACIÓN DE UN CLIENTE UDP PARA EL SERVICIO ECHO
fprint(stderr, “usage: UDPecho[host[port]]\n”);exit(1);
}}UDPecho(host, service);exit(0);
}}intUDPecho (host, service)char *host;;int *service;{
char buf[LINELEN+1];int s, nchars;s = connectUDP (host, service);while (fgets( buf, sizeof(buf), stdin ) ) {
LUIS MENGUAL (c)
buf[LINELEN] = “\0”;nchars = starlen(buf);(void) write (s, buf, nchars);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACIÓN DE UN CLIENTE UDP PARA EL SERVICIO ECHOIMPLEMENTACIÓN DE UN CLIENTE UDP PARA EL SERVICIO ECHO
if (read(s buf nchars) < 0)if (read(s, buf, nchars) < 0)errexit (“socket read failed: %s\n”, sys_errlist[errno] );fputs (buf, stdout);
}}
}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACION DE UN CLIENTE UDP PARA EL SERVICIO TIME (Pto.37)IMPLEMENTACION DE UN CLIENTE UDP PARA EL SERVICIO TIME (Pto.37)
/* cliente udp para el servicio time */intmain(argc argv)main(argc, argv)int argc;char *argv[ ];{{
char *host = “localhost”;char *service = “time”;time t now;_ ;int s,n;
swich (argc) {case 1:
host = “localhost”;break;
LUIS MENGUAL (c)
case 3:service = argv[2]
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE CLIENTESOFTWARE CLIENTE
IMPLEMENTACION DE UN CLIENTE UDP PARA EL SERVICIO TIMEIMPLEMENTACION DE UN CLIENTE UDP PARA EL SERVICIO TIME
case 2:host = argv[2];break;break;
defaul:fprint(stderr, “usage: UDPtime[host[port]]\n”);exit(1);exit(1);
}s = connectUDP (host, service);(void) write(s, MSG, strlen(MSG));( ) ( , , ( ));n = read(s, (char *)&now, sizeof(now) );if (n < 0)
errexit(“read fail: %s\n, sys_errlist[errno] );now = ntohl ( (u_long) now) ;now -= UNIXEPOCH;printf (“ %s, ctime (&now));
LUIS MENGUAL (c)
}exit(0);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
TIPOS DE SERVIDORES:– SERVIDOR ITERATIVO:– SERVIDOR ITERATIVO:
» SERVIDOR QUE EN UN INSTANTE DADO SOLO MANEJA UNA PETICIÓN
SERVIDOR CONCURRENTE:– SERVIDOR CONCURRENTE:» SERVIDOR QUE MANEJA MÚLTIPLES PETICIONES
EN UN INSTANTE DADOSERVIDOR ORIENTADO A CONEXIÓN– SERVIDOR ORIENTADO A CONEXIÓN:
» SERVIDOR QUE USA EL PROTOCOLO TCP– SERVIDOR NO ORIENTADO A CONEXIÓN:
» SERVIDOR QUE USA EL PROTOCOLO UDP (EN EL SERVIDOR NO HAY SOCkETS CONECTADOS UDP)
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDORES ORIENTADOS A CONEXIÓN– EL SERVIDOR ACEPTA Y ATIENDE PETICIONES DEL
CLIENTE SIN OCUPARSE DE LA FIABILIDADCLIENTE SIN OCUPARSE DE LA FIABILIDAD– EL NIVEL DE TRANSPORTE TCP:
» RETRASMITE LOS PAQUETES PERDIDOS» COMPRUEBA ERRORES EN LOS DATOS» REORDENA PAQUETES ENTRANTES» INFORMA AL CLIENTE QUE SE HA ROTO UNA» INFORMA AL CLIENTE QUE SE HA ROTO UNA
COMUNICACIÓN– EL SERVIDOR RESERVA RECURSOS PARA CADA
PETICION DE UN CLIENTEPETICION DE UN CLIENTE» SI REPETIDAMENTE VARIOS CLIENTES SE
CONECTAN A UNA MÁQUINA Y LUEGO SE CAEN PUEDEN DEJAR BLOQUEADO A UN SERVIDOR
LUIS MENGUAL (c)
PUEDEN DEJAR BLOQUEADO A UN SERVIDOR
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDORES NO ORIENTADOS A CONEXIÓN SERVIDORES NO ORIENTADOS A CONEXIÓN– EL SERVIDOR ES RESPONSABLE DE LA FIABILIDAD
(RETRANSMISIÓN ADAPTATIVA)CUALQUIER SERVIDOR QUE ACEPTA O RESPONDE A– CUALQUIER SERVIDOR QUE ACEPTA O RESPONDE A COMUNICACIÓN MULTICAST DEBE SER NO ORIENTADO A CONEXIÓNUN SERVIDOR NO ORIENTADO A CONEXIÓN SIEMPRE– UN SERVIDOR NO ORIENTADO A CONEXIÓN SIEMPRE USA SOCKETS NO CONECTADOS
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSO S OSO S OSOFTWARE SERVIDORSOFTWARE SERVIDOR
SE PUEDEN IMPLEMENTAR DOS PROCEDIMIENTOS SE PUEDEN IMPLEMENTAR DOS PROCEDIMIENTOS QUE MANEJEN LA CONEXIÓN DE UN SOCKET:
socket = passivetTCP (service, qlen)p ( q )socket = passiveUDP (service)
int passiveUDP( service )char *service; /* servicio asociado */char service; / servicio asociado /
{return passivesock (service, “UDP”, 0);
}}
int passiveTCP( service, qlen )char *service; /* servicio asociado */int qlen;
{t i k ( i “TCP” l )
LUIS MENGUAL (c)
return passivesock (service, “TCP”, qlen);}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSO S OSO S O
EL PROCEDURE “passivesock” CREA EL SOFTWARE SERVIDORSOFTWARE SERVIDOR
pSOCKET DEL SERVIDOR
/* passive sock- crea un socket en el servidor*/
intpassivesock (service, protocol, qlen)h * ichar *service;
char *protocol;int qlen;{
struct servent *pse;struct protoent *ppe;p pp ;struct sockaddr_in sin;int s,type;bzero ( (char *)&sin sinzeof(sin));
LUIS MENGUAL (c)
bzero ( (char )&sin, sinzeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = INADDR_ANY
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE SERVIDORSOFTWARE SERVIDOR
/* passive sock- crea un socket en el servidor*/
if ( pse= getservbyname (service, protocol) )sin.sin port = pse->s port;_p p _p ;
else if ( (sin.sin_port = htons( (u_short) atoi (service) ) ) == 0errexit (“can´t get \”%s\” service entry\n”, service);
if ( (ppe= getprotobyname ( protocol ) ) == 0)errexit (“can´t get \”%s\” protocol entry\n”, protocol ) ;
if ( strcmp (protocol, “udp”) == 0 )type = SOCK_DGRAM;
lelsetype = SOCK_STREAM;
LUIS MENGUAL (c)
s= socket (PF_INET, type, ppe->p_proto) ;if ( s<0 )
errexit (can´t create sock: %s\n”, sys_errlist[errno];
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACIONIMPLEMENTACIONSOFTWARE SERVIDORSOFTWARE SERVIDOR
/* i k k t l id *//* passive sock- crea un socket en el servidor*/
if ( bind (s, (struct sockaddr *)&sin, sizeof(sin) ) < 0)errexit (“can´t bind to %s port: %s\n”, service, sys_errlist[errno] );
if ( type == SOCK_STREAM && listen(s,qlen) <0 )( yp _ ( ,q ) )errexit(“can´t listen on %s port: %s\n”,service, sys_errlist[errno] );
return s;return s;
}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR NO ORIENTADO A CONEXIÓN SERVIDOR NO ORIENTADO A CONEXIÓN ITERATIVOITERATIVO (ALGORITMO)(ALGORITMO)ITERATIVO ITERATIVO (ALGORITMO):(ALGORITMO):
– CREA UN SOCKET Y LE ASOCIA (”BIND”) UN NÚMERO DE PUERTO Y UN NÚMERO IP LOCAL
– REPETIDAMENTE LEE UNA PETICON DEL CLIENTE Y FORMULA UNA RESPUESTA
» PARA ACEPTAR UNA PETICION SE UTILIZA LA LLAMADA AL SISTEMA “RECVFROM”A PARTIR DE LA CUAL SE OBTIENE LA DIRECCIÓN DE LA MÁQUINA REMOTA
Ó» PARA RESPONDER A UNA PETICIÓN SE UTILIZA “SENDTO”
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR NO ORIENTADO A CONEXIÓN ITERATIVOSERVIDOR NO ORIENTADO A CONEXIÓN ITERATIVOSERVIDOR NO ORIENTADO A CONEXIÓN ITERATIVOSERVIDOR NO ORIENTADO A CONEXIÓN ITERATIVO
SERVIDOR
PROCESO DE APLICACIÓN
SISTEMA OPERATIVO
LUIS MENGUAL (c)
SOCKET EN PUERTO CONOCIDO PARA TODAS LAS COMUNICACIONES
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SO S OSO S OSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR NO ORIENTADO A CONEXIÓN IMPLEMENTACIÓN DE UN SERVIDOR NO ORIENTADO A CONEXIÓN ITERATIVO PARA EL SERVICIO TIMEITERATIVO PARA EL SERVICIO TIME
intmain(argc, argv)main(argc, argv)int argc;char *argv[ ]{{
struct sockaddr_in fsin;char *service = “time” ;char buf[1];int sock;time_t now;int alen;swich (argc) {case 1:
break;2
LUIS MENGUAL (c)
case 2:service= argv[1 ]break;
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SO S OSO S OSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR NO ORIENTADO A CONEXIÓN IMPLEMENTACIÓN DE UN SERVIDOR NO ORIENTADO A CONEXIÓN
defaul :it(“ UDPti d[ t]\ ”)
ITERATIVO PARA EL SERVICIO TIMEITERATIVO PARA EL SERVICIO TIME
errexit(“ usage: UDPtimed[port]\n”);}
k i UDP( i )sock = pasiveUDP(service);
while (1) {alen = sizeof (fsin);alen = sizeof (fsin);
if recvfrom ( sock, buf, sizeof(buf) , 0 , ( struct sockaddr *)&fsin, &alen)<0 ) ;
(void) time (&now);(void) time (&now);now = htonl ( (u_long) (now + UNIXEPOCH) );(void) sendto (sock, (char *)&now, sizeof(now), 0, (struct sockaddr*)&fsin, sizeof(fsin) );
LUIS MENGUAL (c)
(struct sockaddr )&fsin, sizeof(fsin) );}
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR ORIENTADO A CONEXIÓN ITERATIVO SERVIDOR ORIENTADO A CONEXIÓN ITERATIVO (ALGORITMO):(ALGORITMO):( )( )
– CREA UN SOCKET Y LE ASOCIA (”BIND”) UN NÚMERO DE PUERTO Y UN NÚMERO IP LOCAL
» LA CONSTANTE “INADDR ANY” ESPECIFICA QUE EL» LA CONSTANTE INADDR_ANY ESPECIFICA QUE EL SERVIDOR GATEWAY PUEDE ACEPTAR DATOS EN CUALQUIERA DE SUS NUMEROS IP.
– EL SOCKET QUEDA EN MODO PASIVO ESPERANDO PETICIONES SOC QU O O S O S O C O S(“LISTEN”)
– ACEPTA UNA CONEXIÓN Y OBTIENE UN NUEVO SOCKET PARA ATENDER ESA PETICIÓN
– REPETIDAMENTE LEE UNA PETICIÓN DEL CLIENTE FORMULA UNA RESPUESTA ENVIANDÓLA DE ACUERDO AL PROTOCOLO
– CUANDO FINALIZA CON UN CLIENTE PARTICULAR CIERRA LA
LUIS MENGUAL (c)
CUANDO FINALIZA CON UN CLIENTE PARTICULAR CIERRA LA CONEXION Y VUELVE A ACCEPTAR UNA NUEVA CONEXIÓN
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR ORIENTADO A CONEXIÓN ITERATIVOSERVIDOR ORIENTADO A CONEXIÓN ITERATIVOSERVIDOR ORIENTADO A CONEXIÓN ITERATIVOSERVIDOR ORIENTADO A CONEXIÓN ITERATIVO
SERVIDOR
PROCESO DE APLICACIÓN
SISTEMA OPERATIVOSOCKET PARA SOCKET PARA
LUIS MENGUAL (c)
SOCKET PARA PETICIÓN DE CONEXIONES
SOCKET PARA UNA CONEXIÓN INDIVIDUAL
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SO S OSO S OSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN ITERATIVO PARA EL SERVICIO DAYTIMEITERATIVO PARA EL SERVICIO DAYTIME
intmain(argc, argv)int argc;char *argv[ ]{
struct sockaddr_in fsin;char *service = “daytime” ;int ssock, msock;i t lint alen;swich (argc) {case 1:
break;break;case 2:
service= argv[1]break;
LUIS MENGUAL (c)
break;default:
errexit(“usage: TCPdaytimed [port]\n”);}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SO S OSO S OSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN ITERATIVO PARA EL SERVICIO DAYTIMEITERATIVO PARA EL SERVICIO DAYTIME
msock = passiveTCP (service, QLEN);while (1) {
k t ( k ( t t k dd *)&f i & l )
ITERATIVO PARA EL SERVICIO DAYTIMEITERATIVO PARA EL SERVICIO DAYTIME
ssock = accept (msock, (struct sockaddr *)&fsin, &alen);if (ssock < 0)
errexit(“accept failed: %s\n”, sys_errlist[errno]);TCPdaytimed(ssock);TCPdaytimed(ssock);close (ssock);
} }intintTCPdaytimed(fd)int fd;{ char *pts;{ char pts;
time_t now;char *ctime(&now);(void) time(&now);
LUIS MENGUAL (c)
( ) ( );pts = ctime(&now);(void) write(fd, pts, strlen(pts));return 0; }
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR ORIENTADO A CONEXIÓN CONCURRENTE SERVIDOR ORIENTADO A CONEXIÓN CONCURRENTE (ALGORITMO):(ALGORITMO):
CREA UN SOCKET Y LE ASOCIA (”BIND”) UN NUMERO DE PUERTO– CREA UN SOCKET Y LE ASOCIA (”BIND”) UN NUMERO DE PUERTO Y UN NUMERO IP LOCAL
– EL SOCKET QUEDA EN MODO PASIVO ESPERANDO PETICIONES (“LISTEN”)(“LISTEN”)
– REPETIDAMENTE LLAMA A “ACEPT” PARA RECIBIR PETICIONES DE CLIENTES Y CREAR UN PROCESO HIJO PARA PROCESAR CADA PETICIONPETICION
» EL PROCESO HIJO RECIBE LA PETICION» INTERACTÚA CON EL CLIENTE A TRAVES DE LA CONEXIÓN
(“READ” “WRITE”)(“READ”, “WRITE”)» EL PROCESO HIJO CIERRA FINALMENTE LA CONEXIÓN
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR ORIENTADO A CONEXIÓN CONCURRENTESERVIDOR ORIENTADO A CONEXIÓN CONCURRENTESERVIDOR ORIENTADO A CONEXIÓN CONCURRENTESERVIDOR ORIENTADO A CONEXIÓN CONCURRENTE
PADRE
HIJO1 HIJO2 HIJOn
PROCESO DE APLICACIÓN. . .
SISTEMA OPERATIVOSOCKET PARA SOCKET PARA
LUIS MENGUAL (c)
SOCKET PARA PETICIÓN DE CONEXIONES
SOCKET PARA CONEXIONES INDIVIDUALES
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SO S OSO S OSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓNIMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓNCONCURRENTE PARA EL SERVICIO ECHOCONCURRENTE PARA EL SERVICIO ECHOCONCURRENTE PARA EL SERVICIO ECHOCONCURRENTE PARA EL SERVICIO ECHO
intmain(argc, argv)i tint argc;char *argv[ ]{
struct sockaddr in fsin;struct sockaddr_in fsin;char *service = “daytime” ;int ssock, msock;int alen;int alen;swich (argc) {case 1:
break;break;case 2:
service= argv[1]break;
LUIS MENGUAL (c)
break;default:
errexit(“usage: TCPdaytimed [port]\n”);}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SO S OSO S OSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓNIMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓNCONCURRENTE PARA EL SERVICIO ECHOCONCURRENTE PARA EL SERVICIO ECHO
msock = passiveTCP(service, QLEN);(void) signal(SIGCHILD, reaper);
CONCURRENTE PARA EL SERVICIO ECHOCONCURRENTE PARA EL SERVICIO ECHO
while (1) {alen = sixeof(fsin);ssock = accept(msock, (struct sockaddr *)&fsin, &alen);if (ssock < 0) {
if (errno == EINTR)continue;it(“ t % \ ” li t[ ] )errexit(“accept: %s\n”, sys_errlist[errno] );
}swich (fork( )) {case 0: // PROCESO HIJOcase 0: // PROCESO HIJO
(void) close(msock);exit(TCPechod(ssock));
default:
LUIS MENGUAL (c)
default:(void) close(ssock);break;
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SO S OSO S OSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓNIMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓNCONCURRENTE PARA EL SERVICIO ECHOCONCURRENTE PARA EL SERVICIO ECHO
case -1:errexit(“fork: %s\n”, sys_errlist[errno]);
CONCURRENTE PARA EL SERVICIO ECHOCONCURRENTE PARA EL SERVICIO ECHO
}}
}intTCPecho(fd)int fd;{{
char buf[BUFSIZ];int cc;while (cc = read(fd buf sizeof(buf) {while (cc = read(fd, buf, sizeof(buf) {
if (cc < 0) errxit(“echo read: %s\n”, sys_errlist[errno]);if (write(fd, buf, cc) < 0)
errxit(“echo write: %s\n” sys errlist[errno]);
LUIS MENGUAL (c)
errxit( echo write: %s\n , sys_errlist[errno]); }return 0;
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR NO ORIENTADO A CONEXIÓN SERVIDOR NO ORIENTADO A CONEXIÓN CONCURRENTECONCURRENTE (ALGORITMO)(ALGORITMO)CONCURRENTE CONCURRENTE (ALGORITMO):(ALGORITMO):
– CREA UN SOCKET Y LE ASOCIA (”BIND”) UN NÚMERO DE PUERTO Y UN NÚMERO IP LOCAL
– REPETIDAMENTE LLAMA A “RECVFROM” PARA RECIBIR UNA CONEXIÓN DE UN CLIENTE Y CREA UN PROCESO HIJO PARA ATENDER LA CONEXIÓN
» EL PROCESO HIJO RECIBE LA PETICIÓN DEL PADRE» RESPONDE A LA PETICIÓN CON “SENDTO”» EL PROCESO HIJO TERMINA DESPUÉS DE MANEJAR LA» EL PROCESO HIJO TERMINA DESPUÉS DE MANEJAR LA
CONEXIÓN
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR UDP CONCURRENTE PTO SECUNDARIOSERVIDOR UDP CONCURRENTE PTO SECUNDARIO
SERVIDOR PRINCIPALCLIENTE
Pto serviciosp=Socket principalRecvfrom(...,&Cli)
Pto servicios=Socket sendto(s,...., &SPrin,...))
1er datagrama del clienteRecvfrom(...,&Cli)( , , , ))
Recvfrom(s,.. &SSec,... )FORK(Hijo/hilo)
Crea Pto efimerosendto(s,...., &SSec,...))Recvfrom(s,.. &SSec,... )
SERVIDOR SECUNDARIO
ss=Socket secundario()Bind(ss)sendto(ss,..&Cli,...)
LUIS MENGUAL (c)
Recvfrom(ss, ....)sendto(ss,...)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR ORIENTADO A CONEXIÓN. SIMULACION SERVIDOR ORIENTADO A CONEXIÓN. SIMULACION CONCURRENCIA USANDO UN SOLO PROCESO. CONCURRENCIA USANDO UN SOLO PROCESO. (ALGORITMO):(ALGORITMO):(ALGORITMO):(ALGORITMO):
– CREA UN SOCKET Y LE ASOCIA (”BIND”) UN NÚMERO DE PUERTO Y UN NÚMERO IP LOCAL
– USO DE “SELECT” PARA ESPERAR OPERACIONES E/S EN LOS SOCKETS EXISTENTES
– SI SE DETECTA UNA CONEXIÓN EN EL SOCKET ORIGINAL SE HACE UNA LLAMADA A “ACCEPT”, SE CREA UN NUEVO SOCKET Y SE AÑADE ESTE A LA LISTA DE SOCKETS QUE TESTEA “SELECT”
– SI SE DETECTAN PETICIONES EN LOS SOCKETS DISTINTOS DEL ORIGINAL SE UTILIZARÁN LAS LLAMADAS “READ” PARA LEER LAORIGINAL SE UTILIZARÁN LAS LLAMADAS “READ” PARA LEER LA PETICIÓN Y “WRITE” PARA ENVIAR LA RESPUESTA
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR ORIENTADO A CONEXIÓNSERVIDOR ORIENTADO A CONEXIÓN--UN SOLO PROCESOUN SOLO PROCESOSERVIDOR ORIENTADO A CONEXIÓNSERVIDOR ORIENTADO A CONEXIÓN UN SOLO PROCESOUN SOLO PROCESO
SERVIDOR
PROCESO DE APLICACIÓN
. . .
SISTEMA OPERATIVOSOCKET PARASOCKET PARA
LUIS MENGUAL (c)
SOCKET PARA CONEXIONES INDIVIDUALES
SOCKET PARA PETICIÓN DE CONEXIONES
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
E/S ASINCRONASE/S ASINCRONASE/S ASINCRONASE/S ASINCRONAS
SELECT System Call int select(int nfds, fd_set *readfds,fd_set *writefds, fd_set *exfds, t t ti l *ti t)struct timeval *timeout)– LA LLAMADA AL SISTEMA SELECT PERMITE QUE UN PROCESO DE
USUARIO ORDENE AL KERNEL QUE ESPERE QUE SE PRODUZCAN OPERACIONES DE E/S SOBRE UN COJUNTO DE DESCRIPTORES DEOPERACIONES DE E/S SOBRE UN COJUNTO DE DESCRIPTORES DE FICHEROS Y AVISE AL PROCESO CUANDO UNO DE ESTOS EVENTOS OCURRA.
– FD_SET ES UNA ESTRUCTURA DE BITS, O MÁSCARA QUE IDENTIFICA (MAPEA) UN CONJUTO DE DESCRIPTORES DE FICHEROS(MAPEA) UN CONJUTO DE DESCRIPTORES DE FICHEROS
– SELECT RETORNA EL DESCRIPTOR DE FICHERO EN EL QUE SE PRODUCEN OPERACIONES DE E/S; “0” SI SE SUPERA UN LÍMITE DE TIEMPO Y -1 SI SE PRODUCE UN ERROR
– SI EL PARÁMETRO DE TIMEOUT ES NULO SE ESPERA INDEFINIDAMENTE HASTA QUE SE PRODUZCA UNA OPERACIÓN E/S
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
E/S ASINCRONASE/S ASINCRONASE/S ASINCRONASE/S ASINCRONAS
LA ESTRUCTURA FD_SET SE MANEJA CON LAS MACROS:LAS MACROS:
– FD_ZERO(fd_set *fdset) INICIILIZA LA MASCARA fdsetFD SET(int fd fd set *fdset) :– FD_SET(int fd, fd_set *fdset) : AÑADE EL DESCRIPTOR fd AL CONJUNTO fdset
– FD_CLR(int fd, fd_set *fdset) : BORRA EL DESCRIPTOR fd DEL CONJUNTO fdsetBORRA EL DESCRIPTOR fd DEL CONJUNTO fdset
– FD_ISSET(int fd, fd_set *fdset) : TESTEA SI SOBRE EL DESCRIPTOR fd SE HA PRODUCIDO UNA OPERACION DE E/SPRODUCIDO UNA OPERACION DE E/S
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN ----UN SOLO PROCESO PARA ELSERVICIO ECHOUN SOLO PROCESO PARA ELSERVICIO ECHO
intmain(argc, argv)main(argc, argv)int argc;char *argv[ ]{{
struct sockaddr_in fsin;char *service = “echo” ;int msock;time_t now;int alen, fd, nfds;fd_set rfds, afds; * conjunto descriptores lectura y activos */swich (argc) {case 1:
break;2
LUIS MENGUAL (c)
case 2:service= argv[1 ]break;
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN ----UN SOLO PROCESO PARA ELSERVICIO ECHOUN SOLO PROCESO PARA ELSERVICIO ECHO
default:errexit(“usage: TCPmechod [port]\n”);
}msock = passiveTCP(service. QLEN);nfds = msock+1;FD ZERO(& fd )FD_ZERO(&afds);FD_SET(msock, &afds);while (1) {
bcopy( (char *)&afds (char *)&rfds sizeof(rfds) );bcopy( (char *)&afds, (char *)&rfds, sizeof(rfds) );if (select (nfds, &rfds, (fd_set *)0, (fd_set *)0, (struct tiemval *)0 < 0
errexit(“select: %s\n”, sys_errlist[errno]);if (FD ISSET(msock &rfds)) {if (FD_ISSET(msock, &rfds)) {
int ssock;alen=sizeof(fsin);ssock=accept(msock (struct sockaddr *)&fin &alen);
LUIS MENGUAL (c)
ssock accept(msock, (struct sockaddr )&fin, &alen);if (ssock < 0 )
errexit(“accept: %s\n”, sys_errlist[errno]);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN ----UN SOLO PROCESO PARA ELSERVICIO ECHOUN SOLO PROCESO PARA ELSERVICIO ECHO
FD_SET(ssock, &afds);fd_client=ssock;nfds = MAX(nfds, fd_client)+ 1 ;
}}for (fd=0; fd<nfds; ++fd)
if (fd != msock &&FD_ISSET(fd, &rfds) )if (echo(fd) == 0) {if (echo(fd) == 0) {
(void) close(fd);FD_CLR(fd, &afds);
}}
} //while
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN IMPLEMENTACIÓN DE UN SERVIDOR ORIENTADO A CONEXIÓN ----UN SOLO PROCESO PARA ELSERVICIO ECHOUN SOLO PROCESO PARA ELSERVICIO ECHO
intecho(fd)echo(fd)int fd;{char buf[BUFSIZ]char buf[BUFSIZ]int cc;cc = read(fd, buf, sizeof(buf));if ( 0)if (cc < 0)
errexit(“echo read: %s\n”, sys_errlist[errno]); if (cc && write (fd, buf, cc) < 0)
errexit(“echo write: %s\n”, sys_errlist[errno]); return cc;
}
LUIS MENGUAL (c)
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR ITERATIVO MULTIPROTOCOLO SERVIDOR ITERATIVO MULTIPROTOCOLO (ALGORITMO):(ALGORITMO):( )( )
– EL SERVIDOR INICIALMENTE ABRE DOS SOCKETS UNO PARA TCP Y EL OTRO PARA UDP
– SE USA “SELECT” PARA ESPERAR PETICIONES EN LOS SOCKETSSE USA SELECT PARA ESPERAR PETICIONES EN LOS SOCKETS ABIERTOS
– SI SE RECIBE UNA PETICION TCP SE CREA CON “ACCEPT” UN NUEVO SOCKET PARA ATENDER LA PETICIÓNU O SOC C Ó
– SI SE RECIBE UNA PETICION UDP SE USA “RECVFROM” PARA LEER LOS DATOS Y OBTENER LA DIRECCION DEL REMITENTE. CON “SENDTO” SE DEVUELVE LA RESPUESTA
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR ITERATIVO MULTIPROTOCOLOSERVIDOR ITERATIVO MULTIPROTOCOLOSERVIDOR ITERATIVO MULTIPROTOCOLOSERVIDOR ITERATIVO MULTIPROTOCOLO
SERVIDOR
PROCESO DE APLICACION
SISTEMA OPERATIVOSOCKET PARASOCKET PARA SOCKET PARA
LUIS MENGUAL (c)
SOCKET PARA CONEXION TCP
SOCKET PARA PETICION UDP
SOCKET PARA PETICION TCP
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACIÓN DE UN SERVIDOR ITERATIVO MULTIPROTOCOLO IMPLEMENTACIÓN DE UN SERVIDOR ITERATIVO MULTIPROTOCOLO PARA EL SERVICIO DAYTIMEDPARA EL SERVICIO DAYTIMEDPARA EL SERVICIO DAYTIMEDPARA EL SERVICIO DAYTIMED
intmain(argc, argv)main(argc, argv)int argc;char *argv[ ]{{
struct sockaddr_in fsin;char *service = “daytimed” ;int tsock, usock, nfds, alen;fdset rfds /*descriptor de ficheros de lectura */swich (argc) {case 1:
break;case 2:
service= argv[1 ]b k
LUIS MENGUAL (c)
break;default:
errexit(“usage: daytimed [port]\n”
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACION DE UN SERVIDOR ITERATIVO MULTIPROTOCOLO IMPLEMENTACION DE UN SERVIDOR ITERATIVO MULTIPROTOCOLO PARA EL SERVICIO DAYTIMEDPARA EL SERVICIO DAYTIMEDPARA EL SERVICIO DAYTIMEDPARA EL SERVICIO DAYTIMED
tsock = passiveTCP(service, QLEN);usock = passiveUDP (service);nfds = MAX(tsock usock) +1nfds = MAX(tsock, usock) +1FD_ZERO(&rfds);while (1) {
FD SET(tsock &rfds);FD_SET(tsock, &rfds);FD_SET(usock, &rfds);if (select(nfds, &rfds, (fd_set *) 0, (fd_set *) 0, (struct timeval *)0 < 0)
errexit(“select error: %s\n”, sys errlist[errno];e e t( se ect e o %s\ , sys_e st[e o];if (FD_ISSET(tsock, &rfds) ) {
int ssock;alen = sizeof(fsin);( )ssock = accept(tsock, (struct sockaddr *)¬fsin, &alen);if (ssock < 0)errexit(“acept failed: %s\n”, sys_errlist[errno];
LUIS MENGUAL (c)
daytimed(buf);(void) write(ssock, buf, strlen(buf) );(void) close(ssock); }
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACION DE UN SERVIDOR ITERATIVO MULTIPROTOCOLO IMPLEMENTACION DE UN SERVIDOR ITERATIVO MULTIPROTOCOLO PARA EL SERVICIO DAYTIMEDPARA EL SERVICIO DAYTIMED
SOFTWARE SERVIDORSOFTWARE SERVIDORPARA EL SERVICIO DAYTIMEDPARA EL SERVICIO DAYTIMED
if (FD_ISSET(usock, &rfds) ) {alen = sizeof(fsin);if (recvfrom(usock, buf, sizeof(buf), 0,
(struct sockaddr *) &fsin, &alen) < 0)errexit(“recvfrom: %s\n”, sys_errlist[errno];
d ti d(b f)daytimed(buf);(void) sendto (usock, buf, strlen(buf), 0,
(struct sockaddr *)&fsin, sizeof(fsin) );}}
}intdaytime(buf)daytime(buf)char buf[];char *ctime();time t time() now;
LUIS MENGUAL (c)
time_t time(), now;(void) time(&now);sprintf (buf, “%s”, ctime(&now); }
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR MULTISERVICIO ITERATIVO SERVIDOR MULTISERVICIO ITERATIVO ORIENTADO A CONEXION ORIENTADO A CONEXION
SERVIDOR
PROCESO DE APLICACION. .
SISTEMA OPERATIVO
PROCESO DE APLICACION
LUIS MENGUAL (c)
SISTEMA OPERATIVO
UN SOCKET PARA CADA SERVICIO OFRECIDO
UN SOCKET PARA UNA CONEXION INDIVIDUAL
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR MULTISERVICIO ITERATIVOSERVIDOR MULTISERVICIO ITERATIVOSERVIDOR MULTISERVICIO ITERATIVOSERVIDOR MULTISERVICIO ITERATIVONO ORIENTADO A CONEXIONNO ORIENTADO A CONEXION
SERVIDOR
OC SO C C O
. . .
SISTEMA OPERATIVO
PROCESO DE APLICACION
LUIS MENGUAL (c)
SISTEMA OPERATIVO
UN SOCKET PARA CADA SERVICIO OFRECIDO
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR MULTISERVICIO CONCURRENTESERVIDOR MULTISERVICIO CONCURRENTEORIENTADO A CONEXIONORIENTADO A CONEXION
PADRE
HIJO 1 HIJO
PROCESO DE APLICACION
HIJO 1 HIJO n
SISTEMA OPERATIVO
. . .. .
LUIS MENGUAL (c)
UN SOCKET PARA CADA SERVICIO OFRECIDO
SOCKET PARA CONEXIONES INDIVIDUALES
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
SERVIDOR MULTISERVICIO CONCURRENTESERVIDOR MULTISERVICIO CONCURRENTEORIENTADO A CONEXION ORIENTADO A CONEXION
PADRE
HIJO1 HIJOn
EXECVE
PROCESO DE APLICACION
PROG1 PROGn
SISTEMA OPERATIVO
. . .. .
LUIS MENGUAL (c)
UN SOCKET PARA CADA SERVICIO OFRECIDO
SOCKET PARA CONEXIONES INDIVIDUALES
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO
struct service {struct service {char *sv_name;char sv_useTCP;i t kint sv_sock;int (*sv_func) ( );
}svent[ ] = { { “echo”, TCP_SERV, NOSOCK, TCPechod },
{ “chargen”, TCP_SERV, NOSOCK, TCPchargen },{ “daytime”, TCP SERV, NOSOCK, TCPdaytimed },{ y , _ , , y },{ “time”, TCP_SERV, NOSOCK, TCPtimed },{0 , 0 , 0 , 0 , 0 },
}
LUIS MENGUAL (c)
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO
intmain(argc, argv)int argc;int argc;char *argv[ ]{
struct service *psv *fd2sv[NOFILE];struct service psv, fd2sv[NOFILE];int fd, nfds;fd_set afds, rfds;swich (argc) {s c (a gc) {case 1:
break;case 2:
portbase= (u_short) atoi( argv[1] ) ;break;
default:
LUIS MENGUAL (c)
errexit(“usage: superd [portbase]\n”);}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO fd 0nfds = 0;
FD_ZERO(&afds);for (psv = &svent [0]; psv->sv_name; ++psv) {
if (psv >sv useTCP)if (psv ->sv_useTCP)psv->sv_sock = passiveTCP(psv->sv_name, QLEN);
elsepsv >sv sock = passiveUDP(psv >sv name);psv->sv_sock = passiveUDP(psv->sv_name);
fd2sv [psv->sv_sock] = psv;nfds = MAX (psv->sv_sock+1, nfds);FD SET(psv->sv sock &afds);FD_SET(psv >sv_sock, &afds);
}(void) signal (SIGCHILD, reaper);while (1)while (1)
bcopy( (char *)&afds, (char *)&rfds, sizeof(rfds) );if (select(nfds, &rfds, (fd_set *)0, (fd_set *)0, (struct timeval *)0) <0) {
if (errno = EINTR)
LUIS MENGUAL (c)
( )continue;errexit(“select error: %s\n”, syserrlist[errno] );
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO
for (fd=0; fd<nfds; ++fd)if (FD_ISSET(fd, &rfds) ) {
psv = fd2sv[fd];psv fd2sv[fd];if (psv->sv_useTCP)
doTCP(psv);else
psv->sv_func(psv->sv_sock);}
}}}
intdoTCP(psv)struct service *psv;{
t t k dd i f i
LUIS MENGUAL (c)
struct sockaddr_in fsin;int alen;int fd, ssock;
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
IMPLEMENTACION IMPLEMENTACION SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO IMPLEMENTACION DE UN SERVIDOR MULTISERVICIO
falen = sizeof(fsin);ssock = accept(psv->sv_sock, (struct sockaddr *)&fsin, &alen);if (ssock < 0)if (ssock < 0)
errexit(“accept: %s\n”, sys_errlist[errno]);switch (fork( ) ) {case 0:
break;case -1
errexit(“fork %s\n”, sys_errlist[errno]);( y )default:
(void) close(ssock); // Padrereturn;
}for (fd = nofile; fd>=0, --fd) // Hijo
if (fd != ssock)( id) l (fd)
LUIS MENGUAL (c)
(void) close(fd);exit(psv->sv_func(ssock));
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
EFICIENCIA Y GESTIÓN DEL EFICIENCIA Y GESTIÓN DEL SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
Elección entre un modelo iterativo y concurrenteNivel de concurrencia Nivel de concurrencia
Coste de la concurrenciaC i f ió d l d d Concurrencia en función de la demanda
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
EFICIENCIA Y GESTIÓN DEL EFICIENCIA Y GESTIÓN DEL SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
4 elementos a considerar:– Longitud de los Buffer emisión/recepción– Estimación velocidad de llegada de peticiones – Tiempo de proceso de una petición– Tiempo de creación de procesos hijos– Tiempo de creación de procesos hijos
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
EFICIENCIA Y GESTIÓN DEL EFICIENCIA Y GESTIÓN DEL SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
procesopetición 1
procesopetición 2
CP
creacion hijo 1 creacion hijo 2
petición 1 petición 2
32
C P unidades de tiempopor petición
0 C 2C 2C+P
j j
(C+P)+(2C+P)
3
(C+P)+(2C+P)
0 P 2P
procesopetición 1
procesopetición 2
32
Punidades de tiempo
por petición
LUIS MENGUAL (c)
0 P 2P
P+(2P)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
EFICIENCIA Y GESTIÓN DEL EFICIENCIA Y GESTIÓN DEL SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
CREACION INICIAL DE “N” PROCESOS HIJOS
El servidor crea N procesos hijos Cuando llega una petición un proceso hijo
gestiona la peticiónC d fi li l d ti ió l Cuando finaliza el proceso de una petición el el proceso hijo se queda a la espera de recibir otras peticionesot as pet c o es
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
EFICIENCIA Y GESTIÓN DEL EFICIENCIA Y GESTIÓN DEL SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
CREACION INICIAL DE “N” PROCESOS HIJOSEN UN SERVIDOR ORIENTADO A CONEXIÓN
* Los Hijos/ Hilos esperan en la llamada bloqueante “accept()”
PADRE
Los Hijos/ Hilos esperan en la llamada bloqueante accept()
HIJO1 HIJO2 HIJOn
PROCESO DE APLICACION. . .
SISTEMA OPERATIVO
PROCESO DE APLICACION
LUIS MENGUAL (c)
SISTEMA OPERATIVOSOCKET PARA
PETICION DE CONEXIONESSOCKET PARA
CONEXIONES INDIIVIDUALES(CREADAS POR ACCEPT)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
EFICIENCIA Y GESTIÓN DEL EFICIENCIA Y GESTIÓN DEL SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
CREACION INICIAL DE “N” PROCESOS HIJOSEN UN SERVIDOR NO ORIENTADO A CONEXIÓN
*Los Hijos/ Hilos esperan en la llamada bloqueante “recvfrom()”
PADRE
Los Hijos/ Hilos esperan en la llamada bloqueante recvfrom()
HIJO1 HIJO2 HIJOn
PROCESO DE APLICACION. . .
SISTEMA OPERATIVO
PROCESO DE APLICACION
LUIS MENGUAL (c)
SOCKET EN ELPUERTO DE SERVICIO
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
EFICIENCIA Y GESTIÓN DEL EFICIENCIA Y GESTIÓN DEL SOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDORSOFTWARE SERVIDOR
CREACION DINÁMICA DE PROCESOS HIJOSCREACION DINÁMICA DE PROCESOS HIJOS
El d l ibi ti ió i i i El proceso padre al recibir una petición inicia un temporizador y empieza a procesar la petición de manera iterativap
Si el proceso padre finaliza el proceso de la petición antes de vencer un tiempo
d fi id l l t i dpredefinido cancela el temporizador Si el temporizador vence antes de atender la
petición el proceso padre crea un hijo parapetición el proceso padre crea un hijo para gestionar dicha petición
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
EFICIENCIA Y GESTIÓN DEL EFICIENCIA Y GESTIÓN DEL SOFTWARE SERVIDORSOFTWARE SERVIDOR
COMPARACIÓN DE TÉCNICAS
SOFTWARE SERVIDORSOFTWARE SERVIDOR
COMPARACIÓN DE TÉCNICAS
L ió i i i l d hij útil La creación inicial de procesos hijos es útil en servidores concurrentes no orientados a conexión (P<C)( )
La creción dinámica de procesos hijos es util cuando el tiempo de proceso varía en función d l ti ióde la petición
Un servidor puede crear un hijo dinámicamente y luego dejarlo creado paradinámicamente y luego dejarlo creado para atender nuevas peticiones
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
¿ CUÁNDO USAR CADA TIPO DE SERVIDOR ?¿ CUÁNDO USAR CADA TIPO DE SERVIDOR ?::– SERVIDOR ITERATIVO:
» SI EL TIEMPO DE PROCESO DE UNA PETICION ES CORTO Y UNA SOLUCION ITERATIVA PRODUCE TIEMPO DE RESPUESTA SUFICIENTEMENTE RÁPIDOS PARA LA APLICACIÓN.
– SERVIDORES QUE SIMULAN CONCURRENCIA USANDO UN SOLO PROCESO:
» USAR UN SOLO PROCESO SI EL SERVIDOR DEBE COMPARTIR O» USAR UN SOLO PROCESO SI EL SERVIDOR DEBE COMPARTIR O INTERCAMBIAR DATOS ENTRE CONEXIONES
» EL TIEMPO DE PROCESO DE CADA PETICIÓN DEBE SER CORTO
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
SOFTWARESOFTWARES OS OSERVIDORSERVIDOR
¿ CUANDO USAR CADA TIPO DE SERVIDOR ?¿ CUANDO USAR CADA TIPO DE SERVIDOR ?::– SERVIDORES CONCURRENTES:
» SI LOS PROCESOS HIJOS OPERAN INDEPENDIENTEMENTE» SI LOS PROCESOS HIJOS OPERAN INDEPENDIENTEMENTE» SI EL TIEMPO REQUERIDO PARA CREAR UN PROCESO HIJO ES
MUCHO MAS PEQUEÑO QUE EL TIEMPO REQUERIDO PARA PROCESAR UNA PETICIÓN
– SERVIDORES NO ORIENTADOS A CONEXION:» SI LA APLICACION MANEJA LA FIABLILIDAD» SI EL CLIENTE Y EL SERVIDOR ESTÁN EN UNA RED DE ÁREA» SI EL CLIENTE Y EL SERVIDOR ESTÁN EN UNA RED DE ÁREA
LOCAL– SERVIDORES ORIENTADOS A CONEXION
SI EL CLIENTE Y EL SERVIDOR ESTAN SEPARADOS POR UNA– SI EL CLIENTE Y EL SERVIDOR ESTAN SEPARADOS POR UNA RED DE ÁREA EXTENDIDA
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETS
Winsock 1– API para Microsoft Windows basado en el BSD (Berkeley
Software Distribution) – Funciones equivalentes a BSD para TCP/IP
» socket(), accept(), bind(), closesocket(), connect(), recv(), send(),select(),sendto() .....
– Funciones adaptadas al S O Windows– Funciones adaptadas al S.O Windows» WSAStartup(), WSACleanup(), WSAAsynSelect(),......
Winsock 2E t ió d i k1– Extensión de winsock1
» Soporte multiprotocolo, Multicast, Calidad de servicio, Aceptación condicional, Comparticion socket
– Nuevas funciones:– Nuevas funciones:» WSASocket(), WSAAccept, WSAConnect(), WSARecv(),
WSASend(), WSASendto(),WSARecvfrom(), WSADuplicateSocket()
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSCabeceras LibreríasCabeceras LibreríasCabeceras y LibreríasCabeceras y Librerías
Wi k 1 Winsock 1– <Winsock.h> (librería Wsock32.lib)– Windows CE
Winsock 2– <Winsock2.h> (librería Ws2_32.lib)– Windows 98, Me, NT, 2000, XP– Extensiones:
» Ws2tcpip.h (Utilizada en multicast con Winsock2)» Debe ser utilizada con las librerías
– Wsock32.lib y Ws2_32.lib
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSComparación BerkeleComparación Berkele socketssocketsComparación BerkeleyComparación Berkeley--socketssockets
Windows Sockets Berleley SocketsWSAStartup( )/WSAcleanup
(Inicializacion Windows Sockets dll) ---------------
int socket(); SOCKET socket(); (Inicializacion Windows Sockets dll)
send() / recv() read() / write()send() / recv()
closesocket() close()closesocket()errnoWSAGetLastError()()ioctl()ioctlsockets()
bzero()memset()memset()
fork()-------arpa/inet.h, sys/socket.h
ti t/i h tdb hwinsock.hwinsock2 h
LUIS MENGUAL (c)
netinet/in.h, netdb.hwinsock2.h
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSWINDOWS SOCKETS WINDOWS SOCKETS
CÓDIGO CONNECT // Llamadas para la inicialización de// las librería Windows Sockets por un proceso
#include <winsock2.h> (librería ws2_32.lib)
wVersionRequested = MAKEWORD( 2 2 );wVersionRequested MAKEWORD( 2, 2 ); error = WSAStartup( wVersionRequested, &wsaData );if ( error != 0 ) return(INVALID_SOCKET);
if ( LOBYTE( wsaData.wVersion ) != 2 ||HIBYTE( wsaData.wVersion ) != 2 )
{{WSACleanup( );return(INVALID_SOCKET);
}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS CE SOCKETSWINDOWS CE SOCKETSWINDOWS CE SOCKETS WINDOWS CE SOCKETS
// Llamadas para la inicialización de las librería Windows CE Sockets// Llamadas para la inicialización de las librería Windows CE Sockets
#include <winsock.h> (librería wsock32.lib)
int CMY_SERVIDORDlg::InitSocket(){
//variablesWSADATA wsaData;
if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0){
AfxMessageBox(TEXT("error inicializando\nwinsock dll"), MB_OK | MB_ICONEXCLAMATION);
t 1return 1;}
else return 0;
LUIS MENGUAL (c)
}//init socket
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSWINDOWS SOCKETS WINDOWS SOCKETS
CÓDIGO CONNECT SOCKET s;// Abrimos un socket TCP en el clientes = socket(AF INET, type, 0);s soc et( _ , type, 0);if (s == INVALID_SOCKET){
printf("ERROR AL LLAMAR A SOCKET: %d\n",WSAGetLastError());return(s ); }( ) }
// Cargamos en la estructura sinserv el Nº de Puerto y dir IPdel Servidormemset((void*)&sinserv,0,sizeof(sinserv));sinserv.sin_family = AF_INET; sinserv.sin_port=htons((u_short)atoi(pto_service));sinserv.sin_addr.s_addr = inet_addr(host);
// Asociamos a socket s creado la estructura sinserv que contiene la// Direccion IP y el número de puerto del Servidor
if ( t( ( t t k dd *)& i i f( i )) SOCKET ERROR)
LUIS MENGUAL (c)
if (connect(s, (struct sockaddr *)&sinserv, sizeof(sinserv)) == SOCKET_ERROR){ ................ return(INVALID_SOCKET); }return (s); }
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSWINDOWS SOCKETS WINDOWS SOCKETS
CÓDIGO CLIENTE TCP
SOCKET sockCL;
CÓDIGO CLIENTE TCP
SOCKET sockCL;sockCL=connectTCP(host,pto_service);if (sockCL= INVALID_SOCKET) ...exit (0);
nDatosFichCL= send(sockCL,(char *)&OneFDA,sizeof(OneFDA),0); if (nDatosFichCL == SOCKET_ERROR) .........
while (condición){
(nDatosFichSR=recv(sockCL (char *)&SrFDA sizeof(SrFDA) 0);(nDatosFichSR=recv(sockCL,(char )&SrFDA,sizeof(SrFDA),0);if (nDatosFichSR== SOCKET_ERROR) ...........
}
LUIS MENGUAL (c)
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSWINDOWS SOCKETS WINDOWS SOCKETS
CÓDIGO PASSIVE if ((s = socket(AF_INET, type, 0))==INVALID_SOCKET){ .........}
// Cargamos en la estructura sinserv el Número de Puerto del Servidor// Cargamos en la estructura sinserv el Número de Puerto del Servidor// y direccion IP del servidor. Esta será cualquiera de sus direcciones IP
memset((void*)&sinserv,0,sizeof(sinserv));sinserv.sin family = AF INET;sinserv.sin_family AF_INET;sinserv.sin_port=htons((u_short)atoi(pto_service));sinserv.sin_addr.s_addr = INADDR_ANY;
// Asociamos al socket pasivo creado la estructura sinservif (bind(s,(struct sockaddr *)&sinserv, sizeof(sinserv))==SOCKET_ERROR){ .......... return(INVALID_SOCKET);}
// Si el socket pasivo abierto es TCP lo dejamos a la escuchaif ((type == SOCK_STREAM) && (listen(s,qlen)==SOCKET_ERROR)){ return(INVALID SOCKET); }
LUIS MENGUAL (c)
{ ........... return(INVALID_SOCKET); }
return (s);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSWINDOWS SOCKETS WINDOWS SOCKETS
CÓDIGO SERVIDOR TCPSOCKET sockSR;sockSR=passiveTCP(pto_service,5);while (1)
CÓDIGO SERVIDOR TCP
while (1){
alen = sizeof(fsin);ssockSR=accept(sockSR (struct sockaddr *)&fsin (int*)&alen);ssockSR accept(sockSR,(struct sockaddr )&fsin,(int )&alen);if (ssockSR== INVALID_SOCKET) { ........... );
// Intercambio previo con el cliente // te ca b o p e o co e c e tewhile (condición) {nDatosFichCL=recv(ssockSR,(char *)&ClFDA,sizeof(ClFDA),0);if (nDatosFichCL== SOCKET_ERROR) { .........}( _ ) { }
// PROCESADO DEL SERVICIO .....................................
LUIS MENGUAL (c)
nDatosFichSR= send(ssockSR,(char *)&ClFDA,sizeof(ClFDA),0); if (nDatosFichSR == SOCKET_ERROR) { .........}
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSWINDOWS SOCKETS WINDOWS SOCKETS
CÓDIGO CLIENTE UDPCÓDIGO CLIENTE UDP
SOCKET SockCL;SockCL =connectUDP(host,service);
if ( send(SockCL,(char *FAR) buf1,sizeof(buf1),0) == SOCKET_ERROR ){sCadena.Format("Error : %d\n",WSAGetLastError()).........};
if ( (n=recv(SockCL,buf2,sizeof(buf2),0)) == SOCKET_ERROR ){sCadena.Format("Error : %d\n",WSAGetLastError());........}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINDOWS SOCKETSWINDOWS SOCKETSWINDOWS SOCKETS WINDOWS SOCKETS
CÓDIGO SERVIDOR UDPCÓDIGO SERVIDOR UDP
SockSR = passiveUDP(service);alen = sizeof(fsin);if (nbytes=recvfrom(SockSR ,(char *FAR) buffer_UDP, sizeof(buffer_UDP), 0,
(struct sockaddr *)&fsin, &alen) == SOCKET_ERROR ) {sCadena.Format("Error : %d\n",WSAGetLastError());........}
n = sendto(SockSR , msg, sizeof(msg), 0,(struct sockaddr *)&fsin, sizeof(fsin));
If (n== SOCKET_ERROR ){ C d F t("E %d\ " WSAG tL tE ()) }{sCadena.Format("Error : %d\n",WSAGetLastError());........}
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
IOCTLSOCKET System Callint ioctlsocket (SOCKET sockfd, long cmd, u_long *argp) ;argp) ;
SOCKET s;u long nobloqueante=1;u_long nobloqueante=1;void main(){
s=connectTCP(host,pto_service);
if (ioctlsocket(s, FIONBIO, &nobloqueante)== SOCKET ERROR)if (ioctlsocket(s, FIONBIO, &nobloqueante) SOCKET_ERROR) {
printf("Error : %d\n",WSAGetLastError());exit(1);
LUIS MENGUAL (c)
( );}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
SETSOCKOPT System Callyint setsockopt (SOCKET s, int level, int optname, const char * optval, int optlen) ;
SOCKET sock,ssock;int duracion=10000;int longitud = sizeof(duracion);sock = passiveTCP(pto_servicio,PETICIONES_ENCOLADAS);
while (1){{alen = sizeof(fsin);ssock=accept(sock,(struct sockaddr FAR*)&fsin,(int FAR*)&alen);if (ssock== INVALID SOCKET)if (ssock== INVALID_SOCKET) ..............
if setsockopt (sock, SOL_SOCKET, SO_RCVTIMEO, (char FAR *)&duracion longitud)==SOCKET ERROR)
LUIS MENGUAL (c)
(char FAR )&duracion, longitud)==SOCKET_ERROR) ...}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
GETSOCKOPT System Callyint setsockopt (SOCKET s, int level, int optname, const char * optval, int optlen) ;
// Con esta opción variamos la longitud del buffer de recepción
if (setsockopt(sock SOL SOCKET SO RCVBUF (char*) &buffer recv sizeof(int))<0)if (setsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char ) &buffer_recv, sizeof(int))<0)
printf("Error al llamar a setsockopt: %d\n",WSAGetLastError());
// Con esta opción obtenemos la longitud del buffer de recepción actual
optlen=sizeof(buffer_actual);
if (getsockopt(sock, SOL_SOCKET, SO_RCVBUF, (char*)&buffer_actual, &optlen)<0)
printf("Error al llamar a setsockopt: %d\n",WSAGetLastError());
printf("BUFFER ACTUAL %d\n" buffer actual);
LUIS MENGUAL (c)
printf( BUFFER ACTUAL %d\n , buffer_actual);
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC S
if (multicast)
SOCKETSSOCKETSif (multicast)
{
mreq imr multiaddr s addr=inet addr(multicast ip);mreq.imr_multiaddr.s_addr=inet_addr(multicast_ip); //direccion Multicastmreq.imr_interface.s_addr = htonl(INADDR_ANY); // interfaz asociado a la direccion multicast// interfaz asociado a la direccion multicast
if (setsockopt(s, IPPROTO_IP, IP_ADD_MEMBERSHIP, (const char *) &mreq, sizeof(mreq)) == SOCKET ERROR) (co st c a ) & eq, s eo ( eq)) SOC _ O )
{printf("Error : %d\n",WSAGetLastError());exit(0);( );
}
LUIS MENGUAL (c)
}
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
INET_ADDR System Call Unsigned long inet_addr (char * host )
Convierte una dirección en notacion “x y z k ” en formato– Convierte una dirección en notacion “x .y .z .k .” en formato in_addr
– Retorna la representación binaria de la dirección a incorporar en la estructura sockaddr ine a est uctu a soc add _
– Si ocurre un error retorna INADDR_NONE
struct sockaddr_in sinserv;
sinserv sin addr s addr = inet addr(“138 100 10 9”);sinserv.sin_addr.s_addr = inet_addr( 138.100.10.9 );
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
INET_NTOA System Call char * inet_addr (struct in_addr in )
– Convierte una dirección formato in_addr en notacion i t t “ k ”internet “x .y .z .k .”
– Si ocurre un error retorna NULL
alen = sizeof(fsin);ssock=accept(sock,(struct sockaddr FAR*)&fsin,(int FAR*)&alen);if (ssock== INVALID SOCKET)if (ssock== INVALID_SOCKET) ............
printf("IP DEL CLIENTE %s..... \n",inet_ntoa(fsin.sin_addr));printf("Pto DEL CLIENTE %d \n" ntohs(fsin sin port));printf( Pto DEL CLIENTE %d..... \n ,ntohs(fsin.sin_port));
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
NT0HS System Call char * ntohs (u_short port )
C i t l t d 16 bit f t d– Convierte el puerto de 16 bits en formato de red a formato host
alen = sizeof(fsin);ssock=accept(sock,(struct sockaddr FAR*)&fsin,(int FAR*)&alen);if (ssock== INVALID SOCKET)if (ssock== INVALID_SOCKET) ............
printf("IP DEL CLIENTE %s..... \n",inet_ntoa(fsin.sin_addr));printf("Pto DEL CLIENTE %d..... \n",ntohs(fsin.sin_port));
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
INTERFACE INTERFACE SOC SSOC SSOCKETSSOCKETS
HTONS System Call char * htons (u_short port )
C i t l t d 16 bit f t d– Convierte el puerto de 16 bits en formato de host a formato de red
.................................................memset((void*)&sin,0,sizeof(sin));sin.sin_family = AF_INET;sin.sin_addr.s_addr = INADDR_ANY;
i i t ht (10001)sin.sin_port = htons(10001);//printf("SERVIDOR ITERATIVO");
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
Códigos Error WinsockCódigos Error WinsockCódigos Error WinsockCódigos Error Winsock
10060: Vencimiento temporizador actividad SocketSocket
10061: conexión tcp rechazada por la entidad parp
10048: Pto en uso 10054: Cierre de conexión por la entidad parp p 10035: Sin datos en operaciones no
Bloqueantes .......................................
LUIS MENGUAL (c)
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINSOCK2.HWINSOCK2.HEstructura Estructura sockaddr_insockaddr_in
struct sockaddr_in {short sin_family;u short sin port;u_short sin_port;struct in_addr sin_addr;char sin zero[8];char sin_zero[8];
};
t t i dd {struct in_addr {union {
struct { u char s b1 s b2 s b3 s b4; } S un b;struct { u_char s_b1,s_b2,s_b3,s_b4; } S_un_b;struct { u_short s_w1,s_w2; } S_un_w;u_long S_addr;
LUIS MENGUAL (c)
} S_un;#define s_addr S_un.S_addr
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINSOCK2.HWINSOCK2.Hf óf óDefinición ProtocolosDefinición Protocolos
/*/** Protocols*/#d fi IPPROTO IP 0 /* d f IP */#define IPPROTO_IP 0 /* dummy for IP */#define IPPROTO_ICMP 1 /* control message protocol */#define IPPROTO_IGMP 2 /* internet group management protocol */#define IPPROTO_GGP 3 /* gateway^2 (deprecated) */#define IPPROTO_TCP 6 /* tcp */#define IPPROTO_PUP 12 /* pup */_ p p#define IPPROTO_UDP 17 /* user datagram protocol */#define IPPROTO_IDP 22 /* xns idp */#define IPPROTO ND 77 /* UNOFFICIAL net disk proto */#define IPPROTO_ND 77 / UNOFFICIAL net disk proto /
#define IPPROTO_RAW 255 /* raw IP packet */#define IPPROTO MAX 256
LUIS MENGUAL (c)
#define IPPROTO_MAX 256
INGENIERÍA DE PROTOCOLOS DE COMUNICACIONES - IMPLEMENTACIÓN DE PROTOCOLOS
WINSOCK2.HWINSOCK2.HPuertos ReservadosPuertos Reservados
/*/* Port/socket numbers: network standard functions*/#define IPPORT ECHO 7#define IPPORT_ECHO 7#define IPPORT_DISCARD 9#define IPPORT_SYSTAT 11#define IPPORT_DAYTIME 13#define IPPORT_NETSTAT 15#define IPPORT_FTP 21#define IPPORT_TELNET 23#define IPPORT_SMTP 25#define IPPORT TIMESERVER 37#de e O _ S 3#define IPPORT_NAMESERVER 42#define IPPORT_WHOIS 43#define IPPORT MTP 57
LUIS MENGUAL (c)
#define IPPORT_MTP 57
Top Related