PDF de programación - Tema 7 - Comunicacion mediante sockets - Sistemas Operativos: Programación de Sistemas

Imágen de pdf Tema 7 - Comunicacion mediante sockets - Sistemas Operativos: Programación de Sistemas

Tema 7 - Comunicacion mediante sockets - Sistemas Operativos: Programación de Sistemasgráfica de visualizaciones

Actualizado el 21 de Marzo del 2018 (Publicado el 23 de Febrero del 2018)
505 visualizaciones desde el 23 de Febrero del 2018
368,9 KB
38 paginas
Creado hace 17a (09/01/2007)
Tema 7 : Comunicación mediante
sockets

Sistemas Operativos:
Programación de Sistemas

Oscar Déniz Suárez
Alexis Quesada Arencibia
Francisco J. Santana Pérez
Curso 2006-07

Introducción
 Los sockets (también llamados conectores) son
un mecanismo de comunicación entre procesos
que permiten la comunicación bidireccional tanto
entre procesos que se ejecutan en una misma
máquina como entre procesos lanzados en
diferentes máquinas
 Usados por programas de Internet: telnet, ssh,
www, ...
 Cuando los procesos están en máquinas
distintas la comunicación se lleva a cabo a
través de redes de ordenadores

Introducción
 La comunicación a través de una red de ordenadores es
 Resolver este problema de comunicación construyendo

una tarea compleja
un único módulo monolítico de comunicación no es el
diseño más adecuado
 formatos de representación de datos de ambas máquinas puede
 fiabilidad de la red de comunicaciones y control de errores
 naturaleza de la red de interconexión
 control del flujo de transmisión, etc
 Se sigue un enfoque de diseño por capas, pudiéndose
hablar por tanto de una arquitectura o pila de protocolos
 Cada capa utiliza servicios (funciones) de la capa
inferior y ofrece servicios a la capa superior

ser diferentes

Introducción
 En 1977 la Organización Internacional de
Estandarización (Internacional Standards
Organization, ISO) estableció un subcomité
encargado de diseñar una arquitectura de
comunicación
 El resultado fue el modelo de referencia para la
Interconexión de Sistemas Abiertos OSI (Open
Systems Interconection)
comunicación estructurada en siete niveles
verticales

 Dicho modelo define una arquitectura de

Introducción

Nodo A

Aplicación

Protocolo de aplicación

Nodo B

Aplicación

Presentación

Presentación

Protocolo de presentación

Sesión

Transporte

Protocolo de sesión

Protocolo de transporte

subred de comunicación

Sesión

Transporte

Red

Red

Red

Red

Enlace

Enlace

Enlace

Enlace

Física

Física

Física

Física

Introducción
 Cada paquete enviado por una capa se

compone de control + datos

 El conjunto control+datos de una capa
viaja en los datos de la capa superior

capa i

control

capa i-1

control

datos

datos

Introducción

Modelo TCP/IP

Modelo OSI

Aplicación

Aplicación

Presentación

Sesión

Transporte

Transporte

Internet

Red

Red

Enlace

Física

Introducción
 Los sockets se
pueden ver como
una interfaz con
la capa de
transporte

Aplicación

SOCKET

Transporte

TCP

UDP

Red

Enlace

IP

ICMP

RED

Introducción
 La

Servidor

comunicación
entre
procesos a
través de
sockets se
basa en la
filosofía
CLIENTE-
SERVIDOR

Abrir el canal de
comunicación

comunicar a la red
la dirección del canal

esperar
petición

fork()

atender al

cliente

fin proceso

hijo

Cliente

Abrir el canal de
comunicación

conectar con la
dirección del

servidor

pedir servicio

esperar
respuesta

fin proceso

cliente

Tipos de Sockets
 Existen diferentes tipos de sockets. Los

dos mas empleados son:
 Socket de flujo (SOCK_STREAM, orientado a
conexión): al conectar se realiza una búsqueda de
un camino libre entre origen y destino. Se mantiene el
camino en toda la conexión
 Socket de datagrama (SOCK_DGRAM, no
orientado a conexión): no se fija un camino. Cada
paquete podrá ir por cualquier sitio. No se garantiza
la recepción secuencial

Dominio de un socket
 Los sockets se crean dentro de un dominio de

comunicación que indica el formato de las direcciones
que podrán tomar los sockets y los protocolos que
soportarán dichos sockets (familia de sockets o familia
de direcciones)
 Aunque existen diferentes dominios de comunicación,
dos son los más empleados:
 Dominio AF_UNIX (Address Family UNIX): El cliente y el
servidor deben estar en la misma máquina. Cada socket debe
tener una dirección única y en este caso se utiliza como
dirección el nombre de un archivo local.
 Dominio AF_INET (Address Family INET): El cliente y el
servidor pueden estar en cualquier máquina de la red Internet y
la comunicación se basa en el conjunto de protocolos TCP/IP.
La identificación del socket en este caso se consigue mediante
el par (dirección ip de la máquina, número de puerto).

Sockets
 Nos centraremos en los sockets de

Dominio de Internet (AF_INET)
 Son el tipo más común de sockets
 Se utilizan en casi todos los programas que
soportan la comunicación mediante Internet
 Además son los más genéricos en el sentido
que permiten la comunicación entre procesos
ejecutados en la misma máquina o en
diferentes máquinas

Sockets SOCK_STREAM

socket()

Apertura del socket

bind()

Publicidad de la dirección

Secuencia de llamadas para
una comunicación orientada
a conexión

listen()

Disposición para aceptar conexiones

Servidor

accept()

Aceptar una conexión

socket()

conexión establecida

connect()

petición de servicio

respuesta

read()

write()

write()

read()

close()

Cliente

Sockets

 Apertura de un socket:
#include <sys/types.h>
#include <sys/socket.h>
int socket(int af, int type, int protocol);
 af = la familia de sockets a emplear: AF_INET, ...
 type = tipo de conexión, SOCK_STREAM (circuito
 protocol = (sub)protocolo particular a usar. Si es 0 la

virtual) o SOCK_DGRAM (datagrama)
elección se deja en manos del sistema

Sockets

#include <sys/socket.h>
/* solo para la familia AF_INET... */
#include <sys/netinet.h>
int bind(int sfd, struct sockaddr *addr, int addrlen);
 Asocia un socket a una dirección de red

determinada, especificada en addr, que será
tipo struct sockaddr_in

 addrlen se puede calcular con sizeof

Dirección de un Socket

La forma de la dirección depende de la familia de sockets que se esté usando. Para
la familia AF_INET está definida en <netinet/in.h>


 Direcciones de red IP: identifican a un nodo concreto. P.ej. 192.145.135.8

struct sockaddr {
unsigned short sa_family; //familia de conectores
char sa_data[14]; // 14 bytes para la dirección. Su

};

// significado depende de la familia
// de conectores

/* AF_INET */

sin_family;
sin_port; /* nº de puerto */
sin_zero[8];

sin_addr;/* id. de red y nodo */

/* no usados */

u_long s_addr;

struct in_addr {
};
struct sockaddr_in {

short
u_short
struct in_addr
char

}

 Para enviar a un cliente concreto que está en una máquina de la red
necesitamos la dirección IP de la máquina y el nº de puerto del cliente

Sockets

 Números de puerto:
 Algunos conocidos:

ftp: 20 y 21

telnet: 23

• SMTP: 25
• Time: 37
• www-http: 80

 Rangos:

• 1-255 = aplicaciones públicas
• 255-1023 = para determinadas aplicaciones que necesiten privilegios de
• 1024-4999 = usados por procesos de usuario y del sistema
• > 5000 = usado solo por procesos de usuario

superusuario

 Para indicar al sistema que le reserve al proceso alguno de los

puertos libres colocamos 0.

Sockets: Algunas funciones de
utilidad
 Funciones para la conversión de direcciones

viceversa

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
 Convertir la dirección IP en notación de puntos estándar en decimal y
int inet_aton(const char *cp, struct in_addr *inp);
char *inet_ntoa(struct in_addr in);
 inet_addr es equivalente a inet_aton pero es una interfaz obsoleta
unsigned long inet_addr (const char *cp);
 La macro INADDR_ANY se utiliza para indicar al sistema que emplee
cualquier dirección IP de las asignadas al host (debe emplearse htonl)

Sockets: Algunas funciones de
utilidad
 Cuando la comunicación tiene lugar entre procesos en diferentes

máquinas el orden con que se almacenan en memoria las palabras
multibyte puede ser diferente
máquina puede tener otro distinto
cuenta el orden de bytes en memoria de las máquinas

 Los protocolos TPC y UDP tienen el orden big endian, pero la
 Por ello necesitamos funciones. de conversión para tener en

#include <sys/types.h>
#include <netinet/in.h>
unsigned long htonl(unsigned long hostlong);
unsigned short htons(unsigned short hostlong);
unsigned long ntohl(unsigned long netlong);
unsigned short ntohs(unsigned short netlong);

Sockets

#include <sys/socket.h>
int listen(int sfd, int backlog);
 Indica que el servidor está disponible para recibir
 El socket debe de ser de tipo SOCK_STREAM
 Habilita una cola asociada al socket. La cola se

peticiones de conexión

encargará de alojar peticiones de conexión de los
clientes
en servidores interactivos

 backlog es el tamaño de la cola => debería ser mayor

Sockets

#include <sys/socket.h>
int accept(int sfd, struct sockaddr *addr, int *addrlen);
 Para el proceso servidor. Leer una petición de servicio
 Solo para sockets tipo SOCK_STREAM
 accept extrae la primera petición de conexión que hay
 devuelve un nuevo descriptor de socket
 la estructura addr se rellena con la dirección del socket

en la cola creada con listen

remoto que pide la conexión

Sockets
 La llamada accept devuelve un nuevo

descriptor de socket que será empleado
para la comunicación con el cliente

Puerto conocido

Servidor

Conexión establecida

Cliente

Cualquier puerto libre

Sockets

#include <sys/socket.h>
/* solo para la familia AF_INET... */
#include <sys/netinet.h>
int connect(int sfd, const struct sockaddr *addr, int

addrlen);

 Usada por el cliente para conectar a un servidor
 Si el socket es tipo SOCK_DGRAM no se conecta en la
 Si el socket es tipo SOCK_STREAM la llamada se

llamada, se retorna inmediatamente
bloquea intentando conectar

Sockets

 Las llamadas para leer datos de un
socket son: read, readv, recv, recvfrom,
recvmsg
 read es la misma que se usa en manejo
de ficheros. El descriptor de fichero que
usa sería el descriptor del socket
 read y readv pueden leer de cualquier
descriptor, sea fichero o socket

Sockets

#include <sys/uio.h>
ssize_t readv(int sfd, const struct iovec *iov, size_t iovcnt);
 sfd es el descriptor de socket
 iovcnt es el número de elementos del vector iov
 iov es un array que define diferentes zonas de memoria intermedia
struct iovec {

donde deposi
  • Links de descarga
http://lwp-l.com/pdf9014

Comentarios de: Tema 7 - Comunicacion mediante sockets - Sistemas Operativos: Programación de Sistemas (0)


No hay comentarios
 

Comentar...

Nombre
Correo (no se visualiza en la web)
Valoración
Comentarios...
CerrarCerrar
CerrarCerrar
Cerrar

Tienes que ser un usuario registrado para poder insertar imágenes, archivos y/o videos.

Puedes registrarte o validarte desde aquí.

Codigo
Negrita
Subrayado
Tachado
Cursiva
Insertar enlace
Imagen externa
Emoticon
Tabular
Centrar
Titulo
Linea
Disminuir
Aumentar
Vista preliminar
sonreir
dientes
lengua
guiño
enfadado
confundido
llorar
avergonzado
sorprendido
triste
sol
estrella
jarra
camara
taza de cafe
email
beso
bombilla
amor
mal
bien
Es necesario revisar y aceptar las políticas de privacidad