Descargar

Anuncio
Sockets
Sistemas Distribuidos
Profesor: Néstor González V.
•
•
•
•
•
¿Qué es un socket?
La programación en red se basa en el paso de mensajes porque
no existe un espacio de direccionamiento común que permita la
comunicación por la vía de la memoria compartida.
Un socket permite establecer una conexión a través de la red y
es un medio que un programa puede utilizar para enviar y recibir
mensajes.
El uso más relevante está en el modelo Cliente-Servidor. Los
clientes y servidores necesitan usar sockets para conectarse y
enviarse mensajes a través de la red.
Para establecer una conexión se necesitan las direcciones del
emisor y del receptor, una interfaz para enviar y recibir mensajes
y las funciones e interfaces que provee el stack de protocolos
para mover información en la red.
A diferencia de un ambiente clásico, la programación con sockets
se hace en sistemas que funcionan en forma concurrente. Se
necesita conocer sobre la sincronización, la temporización y la
forma de administrar los recursos compartidos.
Pasos básicos para programar con sockets
• Se crea un socket. Se debe seleccionar un dominio de red y algún tipo
de socket, además se debe definir el protocolo a usar. Un socket es solo
una conexión, no realiza acciones por si mismo
• Se pueden configurar las opciones del socket. Se dispone de varias
opciones que afectan su comportamiento
• Se puede asociar con una dirección de puerto. Se fija la dirección IP
(nivel 3 del stack de protocolos) y se establece el puerto de servicio que
determina las acciones que se pueden realizar en relación con el
protocolo elegido.
• Se puede conectar a otro equipo y establecer un canal bidireccional
entre el programa local y otro programa en la red.
• Se puede cerrar la conexión parcialmente, restringiendo el canal de
envío o de recepción. Se puede después de duplicar el canal
• Se pueden enviar y recibir mensajes, entre otras funciones.
• Siempre se debe cerrar la conexión. Si no se cierran las conexiones
terminadas, se consume CPU y otros recursos, privando a otros
procesos de utilizarlos.
Cliente-Servidor y sockets
Implementación de una arquitectura cliente/servidor
– La aplicación Servidor espera que otras aplicaciones
soliciten sus servicios:
• Utilizando un determinado protocolo de red y de transporte.
• En una determinada dirección de red.
• En un determinado número de puerto.
– La aplicación Cliente solicita los servicios de la
aplicación servidor:
• Utilizando el mismo protocolo de red y de transporte.
• Una dirección de red.
• Un número de puerto.
Creación de un socket
El primer paso para que cualquier aplicación
Cliente o Servidor pueda comunicarse es crear un socket
• Se crea con la función socket().
• Los parámetros son:
– Dominio
– Tipo
– Protocolo
• El valor devuelto es un entero:
– >=0 si el socket es creado correctamente
– <0 si se produce un error en la creación
Creación de un socket: Dominio
Dominio: Indica el dominio de comunicación que se desea
utilizar:
– PF_INET: Protocolos de Internet versión 4
– PF_INET6: Protocolos de Internet versión 6
– PF_IPX: Protocolos IPX (Novell)
– PF_APPLETALK: Protocolos Appletalk
– PF_UNIX o PF_LOCAL: Comunicación local,
optimización de PF_INET para aplicaciones de uso local
(conexión entre aplicaciones dentro del mismo
computador)
– ….son muchos más
Creación de un socket: Tipo
Tipo: Corresponde al tipo de comunicación deseada.
• SOCK_STREAM: Conexión bidireccional confiable con el
flujo de datos ordenados.
• SOCK_DGRAM: Mensajes no confiables, sin conexión,
con una longitud máxima fija.
• SOCK_SEQPACKET: Conexión bidireccional confiable con
el flujo de datos ordenados y datagramas de longitud
máxima fija.
• ...son muchos más…
• No es necesario que todos los tipos de comunicación
estén implementados en todos los dominios.
Creación de un socket: Protocolo
Protocolo: Corresponde al protocolo particular que
utilizará el socket que se está creando:
– Dominio PF_INET y tipo SOCK_STREAM:
• Protocolo de transporte TCP.
– Dominio PF_INET y tipo SOCK_DGRAM:
• Protocolo de transporte UDP.
Ejemplo:
#include <sys/types.h>
#include <sys/socket.h>
...
int s;
...
if ((s=socket(PF_INET,SOCK_STREAM,0))<0)
{
perror(“socket”);
exit(0);
}
Cierre de un socket
El cierre es el último paso cuando se quiere terminar con
una conexión.
Si no se cierra el socket quedan recursos mal utilizados.
• El modo de cierre es independiente del dominio, tipo o
protocolo que utilice el socket.
• Se realiza con la función close().
• Su parámetro es el Descriptor del socket a cerrar.
• Devuelve:
0 si cierra el socket.
<0 si se produce un error.
Números de puertos en el stack de protocolos TCP/IP
En el stack de protocolos TCP/IP un puerto es un punto extremo de
una conexión lógica y el medio por el cual un programa cliente se
comunica con otro programa específico, en un computador, en una
red. Algunos puertos tienen números pre-asignados a ellos por la
IANA: Internet Assigned Numbers Authority:
https://www.iana.org/about
Los números de puertos van desde el 0 al 65536, pero sólo los
puertos del 0 al 1024 están reservados para servicios privilegiados.
Esta lista de números de puertos especifica el puerto usado por el
puerto del servidor como puerto de contacto.
Para más información se debe buscar el RFC 1700.
https://www.ietf.org/rfc/rfc1700.txt
Asociación de un socket a un puerto
Todo socket que actúe como Servidor debe asociarse a un
puerto. Este puerto es el que debe conocer un Cliente para
solicitar un servicio.
Algunos puertos más usados son:
• Puerto 21 TCP: FTP (Transferencia de archivos).
• Puerto 22 TCP: SSH (Conexión segura).
• Puerto 25 TCP: SMTP (Correo electrónico).
• Puerto 80 TCP: HTTP (Web).
• Puerto 443 TCP: HTTPS (Web segura).
• Puerto 53 UDP: DNS (Servidor de nombres).
• Puerto 123 UDP: NTP (Sincronización de la hora).
Asociación de un socket a un puerto
Para asociar un puerto al socket se usa la función bind().
Su sintaxis es:
#include <sys/types.h>
#include <sys/socket.h>
...
int bind(int sockfd, struct sockaddr *addr, int addrlen);
En general se utiliza struct sockaddr_in en lugar de
struct sockaddr y para ello se debe incluir la cabecera:
#include <netinet/in.h>
• sockfd: Un socket que ya ha sido creado con anterioridad.
• addr: Puntero a la estructura sockaddr_in convertida a sockaddr
mediante una conversión forzada de tipo (cast).
• addrlen: Tamaño de la estructura apuntada por el puntero addr.
La estructura sockaddr_in
struct in_addr
{
unsigned long int
s_addr;
};
struct sockaddr_in
{
int sin_family;
unsigned short int
sin_port;
struct in_addr
sin_addr;
};
•
sin_family: Protocolo de comunicación del
socket, debe corresponder con el que se usó
para crear el socket.
• sin_port: Puerto al que se asocia el socket.
• sin_addr.s_addr: Dirección de red en la que
se pone a la escucha el socket (por
ejemplo:127.0.0.1, 147.156.1.1, etc.).
• Si se desea que escuche todas las
direcciones de red del computador se utiliza
la constante INADDR_ANY.
Ejemplo
...
int s;
struct sockaddr_in dir;
...
dir.sin_family=PF_INET;
dir.sin_port=htons(puerto);
dir.sin_addr.s_addr=htonl(INADDR_ANY);
if (bind(s, (struct sockaddr *)&dir, sizeof(struct
sockaddr_in))!=0)
{
perror("bind"); Las funciones htons, htonl (ntohs y ntohl) se usan para
convertir la representación de los datos entre máquinas de tipo
exit(0);
“big_endian” (IBM) y “little_endian” (Intel). Ver detalles en:
}
http://www.gta.ufrj.br/ensino/eel878/sockets/htonsman.html
Otras funciones asociadas a sockets
•
•
•
•
•
•
•
•
listen()
: el socket es puesto en escucha
accept()
: acepta peticiones de conexión
connect() : solicita conexión
read()
: lee datos
write() : escribe datos
recvfrom() : recepción de datos
sendto() : envía datos
select()
: para comprobar el estado de un socket
Lugares con información útil para programar con sockets
La definición del llamado al sistema socket() según Free BSD 101.1 – RELEASE:
https://www.freebsd.org/cgi/man.cgi?query=socket&sektion=2
Funciones y estructuras para programar sockets
http://informatica.uv.es/it3guia/ARS/practicas/Funciones.pdf
El archivo de encabezado para sockets en C: <sys/sockets.h>
http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/socket.h.html
Una guía básica para programar Sockets
http://codigoprogramacion.com/cursos/java/103-sockets-en-java-con-cliente-y-servidor.html#.Vava-ip_Oko
Ejemplos de Sockets en Internet
http://www.gnu.org/software/libc/manual/html_node/Inet-Example.html
Descargar