![Page 1: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/1.jpg)
Tema 5
Comunicación con socketsF. García-Carballeira, Mª. Soledad Escolar,
Luis Miguel Sánchez, Fco. Javier García
Sistemas Distribuidos
Grado en Ingeniería Informática
Universidad Carlos III de Madrid
![Page 2: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/2.jpg)
Contenido
� Conceptos básicos sobre sockets
� Modelo de comunicación
� Sockets
� Datagrama
� Stream
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Stream
� API de programación
� Sockets en C
� Sockets en Java
� Guía de diseño de aplicaciones cliente-servidor
2
![Page 3: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/3.jpg)
Sockets: introducción
� Mecanismo de IPC que proporciona comunicación entre procesos que ejecutan en máquinas distintas
� Aparecieron en 1981 en UNIX BSD 4.2
� Intento de incluir TCP/IP en UNIX
� Diseño independiente del protocolo de comunicación
� Un socket es un descriptor de un punto final de comunicación (dirección
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
3
� Un socket es un descriptor de un punto final de comunicación (dirección IP y puerto)
� Abstracción que:
� Representa un extremo de una comunicación bidireccional con una dirección asociada
� Ofrece interfaz de acceso a los servicios de red en el nivel de transporte
� Protocolo TCP y UDP
![Page 4: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/4.jpg)
Sockets: introducción
RMI and RPC
Sockets
Aplicaciones/servicios
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
4
Aplanamiento (marshalling), representación externa
de datos
Protocolo de transporte
UDP y TCP
![Page 5: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/5.jpg)
Sockets: introducción
� Sujetos a proceso de estandarización dentro de POSIX(POSIX 1003.1g)
� Actualmente disponibles en:
� Casi todos los sistemas UNIX
� Prácticamente todos los sistemas operativos
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
5
� WinSock: API de sockets de Windows
� Macintosh
� En Java como clase nativa
![Page 6: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/6.jpg)
Sockets UNIX
� Dominios de comunicación
� AF_UNIX
� AF_INET
� Tipos de sockets
� Stream (SOCK_STREAM)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
6
� Datragrama (SOCK_DGRAM)
� Direcciones de sockets
![Page 7: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/7.jpg)
Dominios de comunicación
� Un dominio representa una familia de protocolos
� Un socket está asociado a un dominio desde su creación
� Sólo se pueden comunicar sockets del mismo dominio
� Los servicios de sockets son independientes del dominio
� Ejemplos de dominios:
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
7
� Ejemplos de dominios:
� AF_UNIX (o AF_LOCAL): comunicación dentro de una máquina
� AF_INET: comunicación usando protocolos TCP/IP
![Page 8: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/8.jpg)
Tipos de sockets
� Stream (SOCK_STREAM)� Protocolo TCP
� Datagrama (SOCK_DGRAM)� Protocolo UDP
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
8
� Raw (SOCK_RAW)� Sockets sin protocolo de transporte
![Page 9: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/9.jpg)
Sockets stream
� Protocolo TCP (RFC 793)
� Flujo de datos bidireccional
� Orientado a conexión� Debe establecerse una conexión extremo-a-extremo antes del envío y recepción de datos
� Proporcionan fiabilidad
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
9
� Proporcionan fiabilidad� Paquetes ordenados por secuencia, sin duplicación de paquetes, libre de errores
� Ejemplos:� HTTP, Telnet, FTP, SMTP
![Page 10: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/10.jpg)
Sockets datagrama
� Protocolo UDP (RFC 768)� Flujo de datos bidireccional� No orientado a conexión
� No se establece/mantiene una conexión entre los procesos que comunican
� Un datagrama es una entidad autocontenida
� Longitud máxima de un datagrama (datos y cabeceras) es 64
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
10
� Longitud máxima de un datagrama (datos y cabeceras) es 64 KB
� Mantiene separación entre paquetes
� No proporcionan fiabilidad� Paquetes desordenados, duplicados, pérdidas
� Ejemplos:� DNS
![Page 11: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/11.jpg)
Sockets: stream y datagramas
Process AsocketAPI runtime
support
Process Bsocket
API runtimesupport
transport layer software transport layer software
a datagrama logical connection created and maintained
connectionlessdatagram socket
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
11
a logical connection created and maintainedby the runtime support of the datagramsocket API
Process AsocketAPI runtime
support
Process Bsocket
API runtimesupport
transport layer software transport layer software
connection-oriented datagram socket
![Page 12: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/12.jpg)
Correspondencia entre familia y tipos de
sockets
TIPO SOCKET AF_UNIX AF_INET
SOCK_STREAM Yes TCP
SOCK_DGRAM Yes UDP
SOCK_RAW IP
SOCK_SEQPACKT
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
12
FAMILIA TIPO Protocolo Protocolo actual
AF_INET SOCK_DGRAM IPPROTO_UDP UDP
AF_INET SOCK_STREAM IPPROTO_TCP TCP
AF_INET SOCK_RAW IPPROTO_ICMP ICMP
AF_INET SOCK_RAW IPPROTO_RAW raw
![Page 13: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/13.jpg)
Direcciones de sockets
� Cada socket debe tener asignada una dirección única
� Dirección de host (32 bits) + puerto (16 bits) + protocolo
� Las direcciones se usan para:
� Asignar una dirección local a un socket (bind)
� Especificar una dirección remota (connect o sendto)
Las direcciones son dependientes del dominio
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
13
� Las direcciones son dependientes del dominio
� Se utiliza la estructura genérica struct sockaddr
� Cada dominio usa una estructura específica
� Direcciones en AF_UNIX (struct sockaddr_un)
� Nombre de fichero
� Direcciones en AF_INET(struct sockaddr_in)
� Es necesario la conversión de tipos (casting) en las llamadas
![Page 14: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/14.jpg)
Puertos� Un puerto identifica un destino en un computador
� Los puertos se asocian a procesos, � permiten que la transmisión se dirija a un proceso específico en el computador destino
� Un puerto tiene un único receptor y múltiples emisores (excepto multicast)
� Toda aplicación que desee enviar y recibir datos debe abrir un puerto
� Número entero de 16 bits � 2^16 puertos en una máquina ~ 65536 puertos posibles
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
14
� 2^16 puertos en una máquina ~ 65536 puertos posibles� Reservados por la IANA para aplicaciones de Internet: 0-1023 (también llamados well-known puertos)
� Puertos entre 1024 y 49151 son puertos registrados para ser usados por los servicios
� Puertos por encima de 65535 para uso privado
� El espacio de puertos para streams y datagramas es independiente� http://www.iana.org/assignments/port-numbers
![Page 15: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/15.jpg)
� Protocolo
� TCP, UDP
� Dirección IP local (origen)
� Puerto local (origen)
� Dirección IP remota (destino)
Información asociada a una
comunicación
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Dirección IP remota (destino)
� Puerto remoto (destino)
(Protocolo, IP-local, P-local, IP-remoto, P-remoto)
15
![Page 16: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/16.jpg)
Encapsulación de un paquete TCP
Datos
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
16
![Page 17: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/17.jpg)
Encapsulación de un paquete TCP
Datos
DatosCabeceraTCP
Puerto Origen
Puerto Destino
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
17
![Page 18: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/18.jpg)
Encapsulación de un paquete TCP
Datos
Datos
Puerto Origen
Puerto Destino
Protocolo =TCP
IP Origen
CabeceraTCP
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
18
DatosCabeceraTCP
CabeceraIP
IP Origen
IP Destino
![Page 19: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/19.jpg)
Encapsulación de un paquete TCP
Datos
Datos
Puerto Origen
Puerto Destino
Protocolo =TCP
IP Origen
CabeceraTCP
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
19
DatosCabecera
TCPCabecera
IPCabeceraEthernet
ColaEthernet
Tipo de trama = IP
Dirección Eth. Origen
Dirección Eth. Destino
DatosCabeceraTCP
CabeceraIP
IP Origen
IP Destino
![Page 20: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/20.jpg)
Direcciones IP
� Una dirección IP se almacena en una estructura de tipo in_addr
#include <netinet/in.h>
typedef uint32_t in_addr_t ;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
20
typedef uint32_t in_addr_t ;
struct in_addr
{
in_addr_t s_addr;
};
![Page 21: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/21.jpg)
Direcciones de sockets en AF_INET
� Estructura struct sockaddr_in� Debe iniciarse a 0 � La estructura tiene tres campos importantes
� sin_family: dominio (AF_INET)� sin_port: puerto
� sin_addr: dirección del host
family
2-byte port
struct sockaddr_in
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
#include <netinet/in.h>struct sockaddr_in {
short sin_family;u_short sin_port;struct in_addr sin_addr;char sin_zero[8];
};
21
4-byte Net ID, host ID
unused
![Page 22: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/22.jpg)
Direcciones de sockets en AF_UNIX
� La estructura struct sockaddr_un describe la dirección de un socket AF_LOCAL o AF_UNIX
#include <sys/un.h>
struct sockaddr_un { family
struct sockaddr_un
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
22
{
short sun_family;
char sun_path[108];
};
familyPathname
(up to 108 bytes)
![Page 23: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/23.jpg)
Servicios sobre direcciones
� Obtener el nombre de un host
� Transformar direcciones
� Obtener la dirección de un host
� Representación de datos
� Interna
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Interna
� Externa
23
![Page 24: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/24.jpg)
Obtener el nombre de un host
� Función que facilita el nombre de la máquina en la que se ejecuta:
int gethostname (char *name, size_t namelen);
donde:
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
donde:
name referencia al buffer donde se almacena el
nombre
namelen longitud del buffer
24
![Page 25: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/25.jpg)
Ejemplo I: obtener nombre host#include <unistd.h>
void main (){
char maquina[256];int err;
err = gethostname( maquina , 256);
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
err = gethostname( maquina , 256);
printf (“Ejecuto en la maquina %s\n”, maquina);
exit(0);}
25
![Page 26: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/26.jpg)
Transformación de direcciones
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
26
The McGraw-Hill
![Page 27: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/27.jpg)
Obtención de la dirección de host
� Usuarios manejan direcciones en forma de texto:� Notación decimal-punto (ej: 138.100.8.100)� Notación dominio-punto (ej. www.uc3m.es)
� Dos funciones de transformación de direcciones:� Devuelve una dirección IP en notación decimal-punto
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
char * inet_ntoa (struct in_addr in);
� Obtiene una dirección IP a partir de notación decimal punto
int inet_aton (const char *cp, struct in_addr *in);
27
![Page 28: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/28.jpg)
Ejemplo II:
transformación de direcciones#include <netdb.h>#include <stdio.h>
void main (int argc, char **argv){struct in_addr in;
if (argc != 2) {printf ("Uso: %s <decimal-punto>\n", argv[0]);exit (0);
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
28
}if ( inet_aton(argv[1], &in) == 0) {
printf("Error en la dirección\n");exit(0);
}
printf ("La dirección es %s\n", inet_ntoa(in));
exit(0 );}
![Page 29: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/29.jpg)
Obtener la dirección de host
� Obtiene la información de un host a partir de una dirección en formato dominio-punto
struct hostent * gethostbyname (char *str);
Argumentos:
str es el nombre de la máquina
� Obtiene la información de un host a partir de una dirección IP
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Obtiene la información de un host a partir de una dirección IP
struct hostent * gethostbyaddr (void *addr, int len, int type);
Argumentos:
addr es un puntero a una estructura de tipo struct in_addr
len es el tamaño de la estructura
type es AF_INET
29
![Page 30: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/30.jpg)
Estructura hostent
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
30
The McGraw-Hill
![Page 31: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/31.jpg)
Ejemplo III: obtener la dirección de host en dominio-punto
#include <netdb.h>
#include <stdio.h>#include <string.h>
void main(int argc, char **argv) {
struct hostent *hp;struct in_addr in;
hp = gethostbyname(“www.uc3m.es”);
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
if (hp == NULL) {printf (“Error en gethostbyname\n”);exit(0);
}memcpy(&in.s_addr,*(hp->h_addr_list),sizeof(in.s_addr));
printf (“%s es %s\n”, hp->h_name, inet_ntoa(in));}
31
![Page 32: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/32.jpg)
#include <netdb.h>#include <stdio.h>#include <string.h>
main (int argc, const char **argv){
u_int addr; struct hostent *hp;char **p; struct in_addr in;char **q;
Ejemplo IV:obtener la dirección de host en decimal-punto
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
if (argc != 2) {printf("USO: %s Direccion-IP\n", argv[0]);
exit (1);}
err = inet_aton(argv[1], &addr);
if (err == 0) {printf("Direccion IP en formato a.b.c.d\n");exit (2);
}
32
![Page 33: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/33.jpg)
hp=gethostbyaddr((char *) &addr, sizeof (addr), AF_INET);
if (hp == NULL) {
printf(“Error en ....\”n);
exit (3);
}
for (p = hp->h_addr_list; *p!=0;p++){
Ejemplo IV:obtener la dirección de host en decimal-punto
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
33
memcpy(&in.s_addr, *p, sizeof(in.s_addr));
printf("%s\t%s", inet_ntoa(in), hp->h_name);
for (q=hp->h_aliases;*q != 0; q++)
printf("%s\n", *q);
}
exit(0);
}
![Page 34: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/34.jpg)
Orden de los bytes
� Big-endian es el estándar para el ordenamiento de los bytes usado en TCP/IP
� También llamado Network byte order
� Big-endian
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Little-endian
34
![Page 35: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/35.jpg)
� Big Endian
1
Ejemplo: Representación del 1
0 0 0
n n+1 n+2 n+3Direcciones:
LSBMSB
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Little Endian
35
01 0 0
LSBMSB
Dirección de crecimiento
n+3 n+2 n+1 nDirecciones:
Dirección de crecimiento
![Page 36: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/36.jpg)
Representación de datos
� Empaquetamiento de datos (marshalling):� Serialización de las estructuras de datos y conversión de los valores de los datos
a su representación externa
-1.5“Esto es una cadena” 1.2 7.3
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Desempaquetamiento de datos (unmarshalling)� Conversión de los datos a su representación interna
36
…10010111…0110010…
-1.5“Esto es una cadena” 1.2 7.3
Representación en el computador A
Representación en el computador B
![Page 37: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/37.jpg)
Funciones de transformación:
network �� host
� En computadores que no utilicen Big-endian es necesario emplear funciones para traducir números entre el formato que utiliza TCP/IP (Big-endian) y el empleado por el propio computador (Little-endian) :
� Host (Little-Endian) � Network (Big-Endian)
Traduce un número de 32/16 bits representado en el formato del computador al formato de red (TCP/IP)
u_long htonl ( u_long hostlong )
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
37
u_long htonl ( u_long hostlong ) u_short htons (u_short hostshort)
� Network (Big-Endian) � host (Little-Endian)
Traduce un número de 32/16 bits representado en el formato de red (TCP/IP) al formato del computador
u_long ntohl (u_long netlong)u_short ntohs (u_short netshort)
![Page 38: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/38.jpg)
Funciones de transformación
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
38
The McGraw-Hill
![Page 39: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/39.jpg)
Modelos de comunicación
� Sockets stream (SOCK_STREAM)
� Orientado a conexión
� TCP
� Sockets datagrama (SOCK_DGRAM)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Sockets datagrama (SOCK_DGRAM)
� No orientado a conexión
� UDP
39
![Page 40: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/40.jpg)
Modelo de comunicación con sockets
stream
Proceso cliente
Proceso servidor
socket()
socket()
bind()
listen()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
40
accept()
read()
close()
connect()
read()
close()
Peticiónwrite()
Respuestawrite()
Conexión
![Page 41: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/41.jpg)
Modelo de comunicación con sockets
datagrama
Proceso cliente
Proceso servidor
socket()
socket()
bind()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
41
recvfrom()
close()close()
Peticiónsendto()
Respuestarecvfrom() sendto()
![Page 42: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/42.jpg)
Primitivas POSIX
para la gestión de sockets
� Creación de un socket (socket)
� Asignación de direcciones (bind)
� Preparar para aceptar conexiones (listen)
� Aceptar una conexión (accept)
� Solicitud de conexión (connect)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Solicitud de conexión (connect)
� Obtener la dirección de un socket
� Transferencia de datos� Streams
� Datagramas
� Cerrar un socket (close)
42
![Page 43: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/43.jpg)
Creación de un socket (socket)� Crear un socket:
#include <sys/types.h>#include <sys/socket.h>int socket(int dominio, int tipo, int protocolo)
Argumentos:dominio AF_UNIX,AF_INETtipo SOCK_STREAM,SOCK_DGRAMprotocolo dependiente del dominio y tipo
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
43
protocolo dependiente del dominio y tipo� 0 elige el más adecuado� Especificados en /etc/protocols
devuelve: si éxito, un descriptor de socketsi error, -1
� El socket creado no tiene dirección asignada
![Page 44: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/44.jpg)
Ejemplo V: Crear un socket#include <stdio.h>#include <sys/types.h>#include <sys/socket.h>#define TCP 6#define UDP 17 /* ver /etc/protocols */int main (){
/* VARIABLES DEL PROGRAMA */
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
/* VARIABLES DEL PROGRAMA */int sockfd;
if ((sockfd= socket(AF_INET, SOCK_STREAM, TCP))==-1){
printf (“Error en la creación del socket”);exit(-1);
}/* CONTINUACIÓN DEL PROGRAMA */
}
44
![Page 45: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/45.jpg)
Asignación de direcciones (bind)� Asignar dirección a un socket:
#include <sys/types.h>#include <sys/socket.h>
int bind (int sd, struct sockaddr *dir, int long)
Argumentos:sd descriptor devuelto por socketdir dirección a asignarlong longitud de la dirección/tamaño de la estructura sockaddr
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
45
long longitud de la dirección/tamaño de la estructura sockaddr
devuelve –1 si error y 0 si se ejecutó con éxito
� Direcciones en dominio AF_INET (struct sockaddr_in)� Host: una dirección local IP
� INNADDR_ANY: elige cualquiera de la máquina
� Puertos: � 65535 puertos disponibles, de los cuales 0..1023 están reservados� Si 0, el sistema elige uno
� Si no se asigna dirección al socket (típico en clientes)� Se le asigna automáticamente (puerto efímero) en la primera utilización (connect o sendto)
![Page 46: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/46.jpg)
Obtener la dirección de un socket
� Obtener la dirección a partir del descriptor:
int getsockname (int sd, struct sockaddr *dir, int *long)
sd descriptor devuelto por socket
dir dirección del socket devuelta
long parámetro valor-resultado
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
46
� Obtener la dirección del socket en el otro extremo de la conexión:
int getpeername (int sd, struct sockaddr *dir, int *long)
sd descriptor devuelto por socket
dir dirección del socket remoto
long parámetro valor-resultado
![Page 47: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/47.jpg)
Preparar para aceptar conexiones (listen)
� Habilita un socket para recibir conexiones en el servidor TCP
� Realizada en el servidor stream después de socket y bind#include <sys/types.h>
#include <sys/socket.h>
int listen( int sd, int baklog)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
47
Argumentos:
sd: descriptor devuelto por socket
backlog: número máximo de peticiones que se encolarán (algunos manuales recomiendan 5)
antes de ejecutar accept
devuelve –1 si error y 0 si se ejecutó con éxito
![Page 48: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/48.jpg)
Aceptar una conexión (accept)
� Realizada en el servidor stream después de socket, bind y listen
� Bloquea al servidor hasta que se produce la conexión; el servidor obtiene:
� La dirección del socket del cliente
� Un nuevo descriptor que queda conectado al socket del cliente
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
48
� Un nuevo descriptor que queda conectado al socket del cliente
� Después de la conexión quedan activos dos sockets en el servidor:
� El original para aceptar nuevas conexiones
� El nuevo para enviar/recibir datos por la conexión establecida
![Page 49: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/49.jpg)
Aceptar una conexión (accept)#include <sys/types.h>
#include <sys/socket.h>
int accept (int sd, struct sockaddr *dir, int *long)
Argumentos:sd descriptor devuelto por socket
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
49
sd descriptor devuelto por socket
dir dirección del socket del cliente
long parámetro valor-resultado:1) Antes de la llamada: tamaño de dir
2) Después de la llamada: tamaño de la dirección del cliente
que se devuelve
� Devuelve un nuevo descriptor de socket asociado a la conexión
� -1 en caso de error
![Page 50: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/50.jpg)
Solicitud de conexión (connect)
� Realizada en el cliente stream para conectarse al servidor
#include <sys/types.h>#include <sys/socket.h>int connect (int sd, struct sockaddr *dir, int long)
Argumentos:
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Argumentos:sd descriptor devuelto por socketdir dirección del socket remoto
long longitud de la dirección
devuelve –1 si error y 0 si se ejecutó con éxito
� Si el socket no tiene dirección asignada, se le asigna una automáticamente
50
![Page 51: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/51.jpg)
Establecimiento de una conexión en TCP
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
51
@Fuente : James F. Kurose, Keith W. Ross Computer Networking: A Top-Down Approach
![Page 52: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/52.jpg)
Ejemplo VI: Establecimiento de
conexión TCP (clientes)int main (){
int sockfd;struct sockaddr_in server;
if ((sockfd= socket(AF_INET, SOCK_STREAM, 0))==-1){printf (“Error en la creación del socket”);exit(-1);
}server.sin_family = AF_INET;
Proceso cliente
socket()
connect()
read()
close()
Peticiónwrite()
Respuesta
Proceso servidor
socket()
bind()
listen()
accept()
read()
close()
write()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
server.sin_family = AF_INET;server.sin_port = htons (PORT_SERVER);server.sin_addr.s_addr = htonl (IP_SERVER);
if ( connect(sockfd,(struct sockaddr *)&server, sizeof(server)) <0) {
printf (“Error en el connect”);exit(-1);
}/* CONTINUACION CODIGO CLIENTE */
}
52
![Page 53: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/53.jpg)
Ejemplo VI: Establecimiento de
conexión TCP (servidores)int main () {
int sd, newsd, size;
struct sockaddr_in server, client;
if ((sd= socket(AF_INET, SOCK_STREAM, 0))==-1){
printf (“Error en la creación del socket”);
exit(-1);
}
server.sin_family = AF_INET;
Proceso servidor
socket()
bind()
listen()
accept()
read()
close()
Proceso cliente
socket()
connect()
read()
close()
Peticiónwrite()
Respuestawrite()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
server.sin_family = AF_INET;
server.sin_port = htons (PORT_SERVER);
server.sin_addr.s_addr = htonl (IP_SERVER);
/* bind */
if ( bind(sd,(struct sockaddr *)&server, sizeof(server)) <0) {
printf (“Error en el bind”);
exit(-1);
}
53
![Page 54: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/54.jpg)
Ejemplo VI:
continuación (servidores)
listen(sd,5)
for (;;) {
if ( newsd=accept (sd,(struct sockaddr *) &client, sizeof(client)) < 0) {
printf (“Error en el accept”);
exit(-1);
}
Proceso servidor
socket()
bind()
listen()
accept()
read()
close()
Proceso cliente
socket()
connect()
read()
close()
Peticiónwrite()
Respuestawrite()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
/* transferir datos sobre newsd */
….
/* cerrar newsd */
} /* fin for */
/* cerrar sd */
} /* fin main */
54
![Page 55: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/55.jpg)
Transferencia de datos con streams
� Una vez establecida la conexión usando sockets stream, ambos extremos puede transferir datos
� Envío:
int write (int sd, char *mem, int long);
int send (int sd, const void *mem, size_t long, intflags);
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Devuelve el número de bytes enviados o –1 si error� El cuarto parámetro flags permite especificar opciones de envío (man send)
� 0 si no opciones� MSG_OOB|MSG_DONTWAIT|MSG_DONTROUTE
� Pueden no transferirse todos los datos� Es importante comprobar siempre el valor que devuelven estas
llamadas
55
![Page 56: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/56.jpg)
Transferencia de datos con streams
� La recepción es una llamada bloqueante (síncrona)
� Recepción:
int read (int sd, char *mem, int long);int recv (int sd, void *buf,size_t long, int flags);
� Devuelve el número de bytes recibidos o –1 si error� El cuarto parámetro flags permite especificar opciones de recepción (man
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� El cuarto parámetro flags permite especificar opciones de recepción (manrecv)� 0 si no opciones� MSG_OOB|MSG_PEEK|MSG_DONTROUTE
� Pueden no transferirse todos los datos� Es importante comprobar siempre el valor que devuelven estas
llamadas
56
![Page 57: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/57.jpg)
Ejemplo VII:
Transferencia de datos con streams
� Función que envía un bloque de datos con reintentos:
int enviar (int socket, char *mensaje, int longitud){
int r;int l = longitud;do {
r = write(socket, mensaje, l);
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
r = write(socket, mensaje, l);l = l – r;mensaje = mensaje + r;
} while ((l>0) && (r>=0));
if (r < 0)return (-1); /* fallo */
elsereturn (0);
}
57
![Page 58: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/58.jpg)
Transferencia de datos con datagramas� No hay conexión real� Para usar un socket para transferir datos basta con:
� Crearlo (socket)� Asignarle una dirección (bind)
� Si no se le asigna dirección, lo hará el sistema de manera transparente
� Envío:
int sendto (int sd, char *buffer, int long, int flags, struct sockaddr * dir , int addrlen )
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
struct sockaddr * dir , int addrlen )
� Devuelve el número de bytes enviados o –1 si error� Argumentos:
sd descriptor de socket buffer puntero a los datos a enviarlong la longitud de los datosflags opciones de envío (man sendto)dir dirección del socket remotoaddrlen la longitud de la dirección
58
![Page 59: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/59.jpg)
Transferencia de datos con datagramas� Recepción:
int recvfrom (int sd, char *buffer, int long, int flags, struct sockaddr *dir, int addrlen)
� Devuelve el número de bytes recibidos o –1 si error � Argumentos:
sd descriptor de socket buffer puntero a los datos a enviar
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
buffer puntero a los datos a enviarlong la longitud de los datosflags opciones de recepción (man recvfrom)dir dirección del socket remotoaddrlen la longitud de la dirección
� Pueden no transferirse todos los datos� Es importante comprobar siempre el valor que devuelven estas
llamadas
59
![Page 60: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/60.jpg)
Cerrar un socket (close)
� Se usa close para cerrar ambos tipos de sockets (stream y datagrama)
int close (int sd);
� Cierra la conexión en ambos sentidos
� Devuelve –1 si error
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
60
� Se puede cerrar un único extremo:
int shutdown (int sd, int modo);
sd descriptor devuelto por socketmodo SHUT_RD, SHUT_RW o SHUT_RDWR
� Devuelve –1 si error
![Page 61: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/61.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, -, -)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
61
![Page 62: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/62.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, -, -)accept()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
62
![Page 63: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/63.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, -, -)connect()
accept()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
63
![Page 64: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/64.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, -, -)connect()
Nuevo descriptor de socket
accept()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
64
Nuevo descriptor de socket
fork()
(tcp, host-A, 22, host-B, 1500)
![Page 65: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/65.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, host-A, 22)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
65
Conexión (tcp, host-A, 22, host-B, 1500)
![Page 66: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/66.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, host-A, 22)accept()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
66
Conexión (tcp, host-A, 22, host-B, 1500)
![Page 67: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/67.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, host-A, 22)accept()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
67
Conexión
cliente
(host-C, 4000)
(tcp, host-C, 4000, -, -)
(tcp, host-A, 22, host-B, 1500)
![Page 68: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/68.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, host-A, 22)accept()
connect()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
68
Conexión
cliente
(host-C, 4000)
(tcp, host-C, 4000, -, -)
(tcp, host-A, 22, host-B, 1500)
![Page 69: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/69.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, host-A, 22)accept()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
69
Conexión
cliente
(host-C, 4000)
(tcp, host-C, 4000, -, -)
(tcp, host-A, 22, host-B, 1500)
Nuevo descriptor de socket
fork()
(tcp, host-A, 22, host-C, 4000)
![Page 70: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/70.jpg)
Conexión con TCP
Servidor
(host-A, 22)
(tcp, host-A, 22, -, -)
cliente
(host-B, 1500)
(tcp, host-B, 1500, host-A, 22)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
70
Conexión
cliente
(host-C, 4000)
(tcp, host-C, 4000, host-A, 22)
(tcp, host-A, 22, host-B, 1500)
(tcp, host-A, 22, host-C, 4000)
Conexión
![Page 71: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/71.jpg)
Configuración de opciones
� Existen varios niveles dependiendo del protocolo afectado como parámetro
� SOL_SOCKET: opciones independientes del protocolo
� IPPROTO_TCP: nivel de protocolo TCP
� IPPTOTO_IP : nivel de protocolo IP
� Consultar opciones asociadas a un socket
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Consultar opciones asociadas a un socketint getsockopt (int sd, int nivel, int opc,
char *val, int *long)
� Modificar las opciones asociadas a un socketint setsockopt (int sd, int nivel, int opc,
char *val, int long)
� Ejemplos (nivel SOL_SOCKET):
� SO_REUSEADDR: permite reutilizar direcciones
71
![Page 72: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/72.jpg)
¿Por qué utilizar SO_REUSEADDR?
� TCP mantiene las conexiones bloqueadas durante un cierto tiempo (TIME_WAIT)
� La conexión ya ha sido cerrada y no puede utilizarse, pero todavía no se han eliminado las tablas internas asociadas por si permanecen todavía segmentos en tránsito en la red
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
72
permanecen todavía segmentos en tránsito en la red int val = 1;
setsockopt (sd, SOL_SOCKET, SO_REUSEADDR,
(char *) &val, sizeof(int));
![Page 73: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/73.jpg)
SO_RCVBUF, SO_SNDBUF
� Buffer de envío y recepción
� Fijar el tamaño del buffer de envío:
int size = 16384;err = setsockopt (s, SOL_SOCKET, SO_SNDBUF,
(char *)&size, (int)sizeof(size));
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
73
� Conocer el tamaño del buffer de envío:int size;
err = getsockopt (s, SOL_SOCKET, SO_SNDBUF, (char *)&size,(int)sizeof(size));
printf(“%d\n”, size)
![Page 74: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/74.jpg)
TCP_NODELAY
� Envío inmediato (sin intentar agrupar mensajes relativamente juntos en el tiempo)
int option = 1;
rc = setsockopt (s, IPPROTO_TCP,
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
74
TCP_NODELAY,
&option,
sizeof(option));
![Page 75: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/75.jpg)
Sockets de Java
� El paquete java.net de Java permite crear socketsTCP/IP
� Clases para sockets datagrama:
� DatagramSocket
� DatagramPacket
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� DatagramPacket
� Clases para sockets stream:
� ServerSocket
� Socket
75
![Page 76: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/76.jpg)
Sockets datagrama
� DatagramPacket:
� Implementa un objeto que permite enviar o recibir paquetes
� Constructor: DatagramPacket
� Métodos: getAddress, getPort, ...
� http://download.oracle.com/javase/6/docs/api/java/net/DatagramPacket.html
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
76
� DatagramSocket:
� Implementa un socket que se puede utilizar para enviar o recibir datagramas.
� Constructor: DatagramSocket
� Métodos: send, receive, close, setSoTimetout, getSoTimeout,...
� http://download.oracle.com/javase/6/docs/api/java/net/DatagramSocket.html
![Page 77: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/77.jpg)
Sockets datagrama
Vector de bytes
Dirección delreceptor
Proceso emisor
Vector de bytes
Proceso receptor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
77
Objeto DatagramPacket
Objeto DatagramSocket
send
receive
Referencia a objeto
Flujo de datos
Objeto DatagramPacket
Objeto DatagramSocket
![Page 78: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/78.jpg)
Sockets stream� La clase socket implementa un socket stream
� Socket(InetAddress dirección, int puerto)� OutputStream getOutputStream()
� flush
� InputStream getInputStream()� void setSoTimeout(int tiempo_de_espera)� http://download.oracle.com/javase/6/docs/api/java/net/Socket.html
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� La clase ServerSocket implementa un socket a utilizar en los servidores para esperar la conexiones de los clientes� socket accept()� void close()� void setSoTimeout(int tiempo_de_espera)� http://download.oracle.com/javase/6/docs/api/java/net/ServerSocket.html
78
![Page 79: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/79.jpg)
Ejemplo XI:
Modelo de comunicación
Cliente ServerSocket(puerto);
accept();socket(host, puerto)
Servidor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
79
OutputStream
OutputStream
InputStream
InputStream
close() close()
![Page 80: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/80.jpg)
Guía de diseño de aplicaciones cliente-
servidor
� Modelo de comunicación: conexión/no conexión
� Servidor secuencial/concurrente
� Problemas de concurrencia
� Comunicación síncrona/asíncrona
� Localización:
Dirección IP y puerto en destino
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Dirección IP y puerto en destino
� Formato de los datos
� Orden de los bytes: big-endian/little-endian
� Opciones de los sockets
� Protocolo de servicio
� Fiabilidad: Gestión de errores (UDP)
80
![Page 81: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/81.jpg)
Comparación de protocolos
IP UDP TCP
¿Orientado a conexión? No No Si
¿Límite entre mensajes? Si Si No
¿Ack? No No Si
¿Timeouty retransmisión? No No Si
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
¿Timeouty retransmisión? No No Si
¿Detección de duplicación? No No Si
¿Secuenciamiento? No No Si
¿Flujo de control? No No Si
81
![Page 82: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/82.jpg)
Modelo de servidor secuencial
� El servidor sirve las peticiones de forma secuencial
� Mientras está atendiendo a un cliente no puede aceptar peticiones de más clientes
petición
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Cliente
petición
respuesta
servidor
82
![Page 83: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/83.jpg)
Ejemplo VIII:
Programar un servidor y cliente en TCP
clientesumar(5,2)
5+2
servidor
Máquina A Máquina B
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
83
NÚCLEO Resultado = 7 NÚCLEO
RED
![Page 84: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/84.jpg)
Ejemplo VIII: Modelo de comunicación
Proceso cliente
Proceso servidor
socket()
socket()
bind()
listen()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
84
accept()
read()
close()
connect()
read()
close()
Peticiónwrite()
Respuestawrite()
Conexión
![Page 85: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/85.jpg)
Ejemplo VIII: Servidor TCP#include <sys/types.h>#include <sys/socket.h>
void main (int argc, char *argv[]){struct sockaddr_in server_addr, client_addr;int sd, sc;int size, val;int size;int num[2], res;
if (( sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP ))<0)
Proceso servidor
socket()
bind()
listen()
accept()
read()
close()
Proceso cliente
socket()
connect()
read()
close()
Peticiónwrite()
Respuestawrite()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
85
if (( sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP ))<0)printf (“SERVER: Error en el socket”);
val = 1;setsockopt(sd, SOL_SOCKET, SO_REUSEADDR, (char *) &val, sizeof (int));
bzero ((char *)&server_addr, sizeof(server_addr));server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;server_addr.sin_port = htons(4200);
bind(sd, &server_addr, sizeof(server_addr));
![Page 86: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/86.jpg)
Ejemplo VIII: Servidor TCP
listen(sd, 5);size = sizeof( client_addr);
while (1) {printf("esperando conexion\n");
sc = accept(sd, (struct sockaddr *)&client_addr,&size);
read ( sc, (char *) num, 2 *sizeof(int)); // recibe la petición
Proceso servidor
socket()
bind()
listen()
accept()
read()
close()
Proceso cliente
socket()
connect()
read()
close()
Peticiónwrite()
Respuestawrite()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
86
res = num[0] + num[1]; // procesa la petición
write(sc, &res, sizeof(int)); // envía el resultado
close(sc); // cierra la conexión (sc)}
close (sd);exit (0);
} /*fin main */
![Page 87: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/87.jpg)
Ejemplo VIII: Cliente TCP#include <sys/types.h>#include <sys/socket.h>
void main (int argc, char **argv) // en argv[1] == servidor {
int sd;struct sockaddr_in server_addr;struct hostent *hp;int num[2], res;
if (argc != 2){printf ("Uso: cliente <direccion_servidor > \ n");
Proceso cliente
socket()
connect()
read()
close()
Peticiónwrite()
Respuesta
Proceso servidor
socket()
bind()
listen()
accept()
read()
close()
write()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
87
printf ("Uso: cliente <direccion_servidor > \ n");exit (0);
}
sd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
bzero ((char *)&server_addr, sizeof(server_addr));hp = gethostbyname (argv[1]);
memcpy (&(server_addr.sin_addr), hp->h_addr, hp->h_length) ;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(4200);
![Page 88: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/88.jpg)
Ejemplo VIII: Cliente TCP
// se establece la conexiónconnect(sd, (struct sockaddr *) &server_addr, sizeof(server_ addr));
num[0]=5;num[1]=2;
write(sd, (char *) num, 2 * sizeof (int)); // envía la petición
Proceso cliente
socket()
connect()
read()
close()
Peticiónwrite()
Respuesta
Proceso servidor
socket()
bind()
listen()
accept()
read()
close()
write()
Conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
88
read(sd, &res, sizeof (int)); // recibe la respuesta
printf ("Resultado es %d \n", res);
close (sd);exit (0);
} /* fin main */
![Page 89: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/89.jpg)
Ejemplo IX:
Programar un servidor y cliente en UDP
clientesumar(5,2)
5+2
servidor
Máquina A Máquina B
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
89
NÚCLEO Resultado = 7 NÚCLEO
RED
![Page 90: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/90.jpg)
Ejemplo IX:
Modelo de comunicación
Proceso cliente
Proceso servidor
socket()
socket()
bind()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
90
recvfrom()
close()close()
Peticiónsendto()
Respuestarecvfrom() sendto()
![Page 91: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/91.jpg)
Ejemplo IX:
Servidor UDP#include <sys/types.h>
#include <sys/socket.h>
void main (void)
{
int num[2];
int s, res, clilen;
struct sockaddr_in server_addr, client_addr;
Proceso cliente
Proceso servidor
socket()
socket()
bind()
recvfrom()
close()close()
Peticiónsendto()
Respuestarecvfrom() sendto()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
91
s = socket(AF_INET, SOCK_DGRAM, 0);
bzero ((char *)&server_addr, sizeof (server_addr));
server_addr.sin_family = AF_INET;
server_addr.sin_addr.s_addr = INADDR_ANY;
server_addr.sin_port = htons(7200);
bind(s, (struct sockaddr *)&server_addr, sizeof (server_addr));
![Page 92: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/92.jpg)
Ejemplo IX:
Servidor UDP
clilen = sizeof (client_addr);
while (1)
{
recvfrom(s, (char *) num, 2* sizeof (int), 0,
(struct sockaddr *)&client_addr, &clilen);
Proceso cliente
Proceso servidor
socket()
socket()
bind()
recvfrom()
close()close()
Peticiónsendto()
Respuestarecvfrom() sendto()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
92
res = num[0] + num[1];
sendto(s, (char *)&res, sizeof (int), 0,
(struct sockaddr *)&client_addr, clilen);
}
} /* fin main */
![Page 93: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/93.jpg)
Ejemplo IX:
Cliente UDP
void main (int argc, char *argv[]){
struct sockaddr_in server_addr, client_addr;struct hostent *hp;int s, num[2], res;
if (argc != 2){printf ("Uso: cliente <direccion_servidor> \n");exit (0);
Proceso cliente
Proceso servidor
socket()
socket()
bind()
recvfrom()
close()close()
Peticiónsendto()
Respuestarecvfrom() sendto()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
93
exit (0);}
s = socket(AF_INET, SOCK_DGRAM, 0);hp = gethostbyname (argv[1]);
bzero ((char *)&server_addr, sizeof(server_addr));memcpy (&(server_addr.sin_addr), hp->h_addr, hp->h_length) ;server_addr.sin_family = AF_INET;server_addr.sin_port = htons(7200);
![Page 94: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/94.jpg)
Ejemplo IX:
Cliente UDPbzero ((char *)&client_addr, sizeof(client_addr));client_addr.sin_family = AF_INET;client_addr.sin_addr.s_addr = INADDR_ANY;client_addr.sin_port = htons(0);
bind (s, (struct sockaddr *)&client_addr, sizeof (client_addr));
num[0] = 2;num[1] = 5;
Proceso cliente
Proceso servidor
socket()
socket()
bind()
recvfrom()
close()close()
Peticiónsendto()
Respuestarecvfrom() sendto()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
94
sendto(s, (char *)num, 2 * sizeof(int), 0, (struct sockaddr *) &server_addr, sizeof (server_addr));
recvfrom(s, (char *)&res, sizeof(int), 0, NULL, NULL);
printf ("2 + 5 = %d\n", res);close(s);
}
![Page 95: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/95.jpg)
Problemas de los ejemplos anteriores
� Comprobación de errores. Muy importante
� Problemas en la transferencia de los datos
� Ordenamiento de los bytes
� ¿Qué ocurre si el cliente es little-endian y el servidor big-endian?
� Hay que resolver el problema de la representación de los datos. Una posibilidad es utilizar las funciones:
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
95
u_long htonl (u_long hostlong)
u_short htons (u_short hostshort)
u_long ntohl (u_long netlong)
u_short ntohs (u_short netshort)
� Definir el formato de representación e intercambio de datos
� Los datos que se envian a la red deben estar en Network Byte Order
� Los datos que se reciben de la red deben estar en Host Byte Order
![Page 96: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/96.jpg)
Ejemplo X: Programar un servidor y cliente
usando sockets datagramas de Java
clientesumar(5,2)
5+2
servidor
Máquina A Máquina B
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
96
NÚCLEO
5+2
Resultado = 7 NÚCLEO
RED
![Page 97: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/97.jpg)
Ejemplo X:
Cliente (datagramas)import java.lang.* ;
import java.io.* ;
import java.net.* ;
import java.util.* ;
public class client{
public static void main ( String [] args)
{
byte bsend[] = new byte[100];
byte brecv [] = new byte[100];
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
97
byte brecv [] = new byte[100];
InetAddress server_addr = null;
DatagramSocket s = null;
DatagramPacket in = null;
DatagramPacket out = null;
int res; int num[] = new int[2];
if (args.length != 1) {
System.out.println("Uso: cliente <host>");
System.exit(0);
}
![Page 98: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/98.jpg)
Ejemplo X:
Cliente (datagramas)try
{
// se crea el socket del cliente
s = new DatagramSocket();
// direción del servidor
server_addr = InetAddress. getByName(args[0]);
num[0] = 2;
num[1] = 5;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
98
num[1] = 5;
// empaquetar los datos.
ByteArrayOutputStream baos = new ByteArrayOutputStrea m() ;
ObjectOutputStream dos = new ObjectOutputStream(baos );
dos.writeObject(num);
bsend = baos.toByteArray() ; // se obtiene el buffer (datagrama)
// un único envio
out = new DatagramPacket (bsend, bsend.length, server_addr, 2500);
s. send(out);
![Page 99: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/99.jpg)
Ejemplo X:
Cliente (datagramas)// se recibe el datagrama de respuesta
in = new DatagramPacket (brecv, 100);
s. receive (in);
// se obtiene el buffer
brecv = in. getData ();
// se desempaqueta
ByteArrayInputStream bais = new ByteArrayInputStream( brecv) ;
DataInputStream dis = new DataInputStream ( bais );
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
99
DataInputStream dis = new DataInputStream ( bais );
res = dis. readInt ();
System.out.println("Datos recibidos " + res);
}
catch (Exception e) {
System.err.println("<<<<<excepcion " + e.toString() );
e.printStackTrace() ;
}
}
}
![Page 100: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/100.jpg)
Ejemplo X:
Servidor (datagramas)
import java.lang.* ;
import java.io.* ;
import java.net.* ;
import java.util.* ;
public class servidor {
public static void main ( String [] args) {
DatagramSocket s = null;
DatagramPacket in, out ;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
100
DatagramPacket in, out ;
InetAddress client_addr = null;
int client_port;
byte brecv[] = new byte[100];
byte bsend[] = new byte[100];
int num[], res;
try {
s = new DatagramSocket(2500);
in = new DatagramPacket(brecv, 100); // paquete para recibir la solicitud
![Page 101: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/101.jpg)
Ejemplo X:
Servidor (datagramas)
while (true) {
s. receive(in); //esperamos a recibir
// obtener datos
brecv = in. getData();
client_addr = in.getAddress();
client_port = in.getPort();
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
101
// desempaquetar los datos
ByteArrayInputStream bais = new ByteArrayInputStream( brecv);
ObjectInputStream dis = new ObjectInputStream(bais);
num = (int[])dis.readObject();
res = num[0] + num[1];
![Page 102: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/102.jpg)
Ejemplo X:
Servidor (datagramas)ByteArrayOutputStream baos = new ByteArrayOutputStre am();
DataOutputStream dos = new DataOutputStream(b aos);
dos.writeInt(res);
bsend = baos.toByteArray();
out = new DatagramPacket ( bsend,
bsend.length,client_addr,
client_port);
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
102
s. send(out);
}
}
catch(Exception e) {
System.err.println("excepcion " + e.toString() );
e.printStackTrace() ;
}
}
}
![Page 103: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/103.jpg)
Ejemplo XI: Programar un servidor y cliente
usando sockets stream de Java
clientesumar(5,2)
5+2
servidor
Máquina A Máquina B
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
103
NÚCLEO
5+2
Resultado = 7 NÚCLEO
RED
![Page 104: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/104.jpg)
Ejemplo XI:
Servidor streamimport java.lang.* ;import java.io.* ;import java.net.* ;import java.util.* ;
public class servidor{
public static void main ( String [] args) {
ServerSocket serverAddr = null;Socket sc = null ;
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
104
Socket sc = null ;int num[] ; // peticiónint res; try {
serverAddr = new ServerSocket(2500);} catch (Exception e){
System.err.println("Error creando socket");}
![Page 105: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/105.jpg)
Ejemplo XI:
Servidor streamwhile (true){
try {
sc = serverAddr. accept(); // esperando conexión
InputStream istream = sc.getInputStream();
ObjectInput in = new ObjectInputStream(istream);
num = (int[]) in. readObject ();
res = num[0] + num[1];
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
105
DataOutputStream ostream = new DataOutputStream (sc.getOutputStream());
ostream. writeInt (res);
ostream. flush ();
sc. close();
}
catch(Exception e) {
System.err.println("excepcion " + e.toString() );
e.printStackTrace() ;
}
}
}
}
![Page 106: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/106.jpg)
Ejemplo XI:
Cliente streamsimport java.lang.* ;import java.io.* ;import java.net.* ;import java.util.* ;
public class client{
public static void main ( String [] args) {
int res;int num[] = new int [2];
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
106
int num[] = new int [2];
if (args.length != 1) {System.out.println("Uso: cliente <host>"); System.exit(0);
}try {
// se crea la conexiónString host = args[0];
Socket sc = new Socket(host , 2500); // conexión
![Page 107: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/107.jpg)
Ejemplo XI:
Cliente stream
OutputStream ostream = sc.getOutputStream();ObjectOutput s = new ObjectOutputStream(ost ream);DataInputStream istream = new DataInputStream(sc.getI nputStream());
num[0] = 5; num[1] = 2; //prepara la petición
s. writeObject (num);s. flush ();
res = istream. readInt ();
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
107
res = istream. readInt ();
sc. close ();System.out.println("La suma es " + res);
} catch (Exception e){
System.err.println("excepcion " + e.toString() );e.printStackTrace() ;
}}
}
![Page 108: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/108.jpg)
Modelo de servidor concurrente
� El servidor crea un hijo que atiende la petición y envía la respuesta al cliente
� Se pueden atender múltiples peticiones de forma concurrente
peticiónservidor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
Cliente
respuesta
Crea un procesohijo
Proceso hijo
108
![Page 109: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/109.jpg)
Servidores concurrentes con sockets
stream
Proceso cliente
Proceso servidor
socket()
socket()
bind()
listen()
Abrir conexión
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
109
accept()
read()
close()
connect()Abrir conexión
read()
close()
Peticiónwrite()
Respuestawrite()
Crear proceso hijo
![Page 110: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/110.jpg)
Modelo de comunicación con sockets
datagrama
Proceso cliente
Proceso servidor
socket()
socket()
bind()
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
110
recvfrom()
close()close()
Peticiónsendto()
Respuestarecvfrom()
sendto()
Crear proceso hijo
![Page 111: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/111.jpg)
Tipos de servidores concurrentes
� Un proceso servidor concurrente puede crear dos tipos de procesos:
� Procesos convencionales (fork)
� Procesos ligeros (threads)
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
111
![Page 112: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/112.jpg)
Procesos concurrentes con fork� El servidor crea un socket s y le asocia una dirección� El cuerpo principal del servidor es:
for(;;) {sd = accept(s, (struct sockaddr *)&cliente, &len);
pid = fork(); /* El hijo hereda el descriptor de socket */if (pid == -1)
printf (“Imposible crear mas hijos \ n”);
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
printf (“Imposible crear mas hijos \ n”);elseif (pid == 0)/* proceso hijo */
{close (s);tratar_peticion(sd);close(sd);exit(0);
}close(sd); /* el padre */
}
112
![Page 113: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/113.jpg)
Procesos concurrentes con fork
� En el modelo anterior el proceso padre no espera la terminación de los procesos hijos con wait
� Los procesos hijos cuando mueren quedan en estado zombie (no desaparecen del sistema)
� Para que los procesos hijos no queden zombies se puede ejecutar en el padre (sólo para UNIX System V):
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
ejecutar en el padre (sólo para UNIX System V):
signal(SIGCHLD, SIG_IGN);
113
![Page 114: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/114.jpg)
Servidores concurrentes con P. ligeros
Cliente
petcición
Crea thread de servicio
servidor
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
114
respuesta
Thread de servicio
![Page 115: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/115.jpg)
Procesos concurrentes con threads� El servidor crea un socket s y le asocia una dirección� El cuerpo principal del servidor es:
pthread_attr_init(&attr);pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
for(;;) {sd = accept(s, (struct sockaddr *)& &cliente, &len);pthread_create(&thid, &attr, tratar_peticion , &sd);
}
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� La función que ejecuta el proceso ligero es:
void tratar_peticion (int * s) {int s_local;
s_local = *s;/* tratar la petición utilizando el descriptor de s _local */close(s_local);pthread_exit(NULL);
}
� ¿Es correcta esta solución?
115
![Page 116: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/116.jpg)
Necesario sincronización
� La solución anterior es incorrecta ya que los procesos padre e hijo compiten por el acceso al descriptor (sd) devuelto por accept � El proceso ligero hijo creado podría usar sd en tratar_petición mientras que un
nuevo sd es asignado en accept
� Condiciones de carrera
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Necesario sincronizar las acciones con mutex y variables condicionales� En el proceso servidor principal
� En los procesos ligeros hijos
116
![Page 117: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/117.jpg)
Necesario sincronización
� El proceso ligero principal debe ejecutar:
for (;;) {sd = accept(s, (struct sockaddr *) &cliente, &len);pthread_create(&thid, &attr, tratar_peticion, &sd);/* esperar a que el hijo copie el descriptor */
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
117
pthread_mutex_lock(&m);while(busy == TRUE)
pthread_cond_wait(&m, &c);busy = TRUE;pthread_mutex_unlock(&m);
}
![Page 118: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/118.jpg)
Necesario sincronización
� El proceso ligero hijo debe ejecutar:
void tratar_peticion (int * s) {
int s_local;
pthread_mutex_lock(&m);
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
s_local = *s;
busy = FALSE;
pthread_cond_signal(&c);
pthread_mutex_unlock(&m);
/* tratar la petición utilizando el descriptor s_lo cal */
pthread_exit(NULL);
}
118
![Page 119: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/119.jpg)
Servidor concurrente en Java (streams)
while (true){
try {
Socket cliente = serverAddr. accept();
new TratarPeticion (cliente).start();
}
catch(Exception e) {
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
System.err.println("excepcion " + e.toString() );
e.printStackTrace() ;
}
}
}
}
119
![Page 120: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/120.jpg)
Servidor concurrente en Java (streams)class TratarPeticion extend Thread {
private Socket sc;
TratarPeticion (Socket s) {
sc = s;
}
public void run() {
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
public void run() {
// TODO: código del cliente
}
120
![Page 121: Tema 5 Comunicación con socketsocw.uc3m.es/.../Tema5_sockets.pdf · Cada socket debe tener asignada una dirección única Dirección de host (32 bits) + puerto (16 bits) + protocolo](https://reader034.vdocuments.co/reader034/viewer/2022042712/5f8d0b546c598d1da12cd452/html5/thumbnails/121.jpg)
Bibliografía y ejemplos
� Ejemplos de programas usando sockets:
� Ejemplo de sockets
� Ejemplo de uso de sockets en Java
� http://www.php-es.com/ref.sockets.html
� Sockets en Java
Programas de ejemplos de sockets y RPC
F. García-Carballeira, Mª. Soledad Escolar, Luis Miguel Sánchez, Fco. Javier García
Este obra está bajo una licencia de Creative Commons Reconocimiento-NoComercial-CompartirIgual 3.0 España.
� Programas de ejemplos de sockets y RPC
121