LABORATORIO DE ESTRUCTURA
DE COMPUTADORES II
Desarrollo de aplicación
Cliente-Servidor
Introducción:
Llamaremos servidor a aquel programa que
presta algún servicio a otros , que acceden a
él mediante invocaciones.
 El servidor toma un papel pasivo en la
comunicación.
 El servidor “avisa” al sistema del servicio
que presta,
y espera solicitudes de
conexión.

Introducción:
Llamaremos cliente a aquel programa que
hace uso de alguna de las prestaciones del
servidor.
 El cliente toma un papel activo en la
comunicación. Es el que debe tomar la
iniciativa de la demanda de conexión a un
servidor.

Introducción:

El modelo cliente servidor presenta
numerosas ventajas:
 Especialización
 Permite
de los servidores.
compartir recursos caros o escasos.
 Se puede tener acceso a servicios remotos.
Introducción:

Una de las principales características de este
sistema es su capacidad de conexión remota,
de esta manera a través de una red se puede
conectar un cliente a un servidor remoto:
Red
Cliente
Servidor
Introducción:
Para hacer portable el esquema cliente
servidor, ambos programas se escriben a
nivel de aplicación.
 Existen diferencias en la estandarización de
las capas en el modelo OSI y TCP/IP como
veremos a continuación:

OSI
OSI
v/s
Internet TCP/IP
Internet TCP/IP
Telnet, FTP,
etc.
Aplicación
Presentación
Aplicación
Sesión
Socket
Transporte
Transporte
TCP/UDP
Red
Enlace
Física
Red
Física
IP
Tarjeta de
red
Sockets:
La experiencia del laboratorio se basa en la
utilización de sockets, que son la
herramienta en UNIX para comunicarse
entre dos procesos cualesquiera que
pertenezcan a un mismo sistema o a dos
sistemas diferentes.
 Un socket es un punto de comunicación por
el cual un proceso podrá emitir o recibir
información.

Sockets:
Para entender el concepto se puede hacer el
paralelo con la comunicación de individuos
por correo o por teléfono.
 Cada una de las entidades implicadas en una
comunicación debe disponer de un punto de
contacto: se puede tratar de un buzón o de
un receptor telefónico.

Sockets:

Un socket no es otra cosa que el equivalente
en el sistema a uno de estos objetos.
Ports:
Cada comunicación establece un socket, sin
embargo el otro extremo no tiene por qué
conocer el socket.
 Para remediar el problema al servicio
asociado al socket se le asocia un “port” por
donde el socket “escucha” o “habla”.
 Así, servidor y cliente se comunican a
través de un puerto determinado.

Ports:
Host A
Host B
Socket :
Socket :
54623
13245
Puerto : 1525
Puerto : 1525
Proceso de conexión:
Servidor:
•Crea socket del servidor.
socket(a,b,c)
•Asocia un puerto al socket creado
.
Cliente:
connect(a,b,c)•Espera por requerimiento.
bind(a,b,c)
•Crea socket del cliente.
listen(a,b)
•Intenta conectarse al servidor.
accept(a,b,c)
•Acepta conexión.
•Conexión establecida.
•Envía requerimiento.
•Acepta requerimiento.
read(a,b,c)
write(a,b,c) •Procesa la petición.
•Espera respuesta.
•Envía respuesta.
close(a)
read(a,b,c)
•Cierra socket.
write(a,b,c)
close(a)
•Cierra socket.
socket(a,b,c)
Funciones utilizadas:

Creación de un socket:
 resul

= socket ( FAM_PROT, TIPO, PROTOCOLO )
FAM_PROT: Especifica la familia del protocolo que usara el
sockets ( TCP/IP, PUP, etc ).

TIPO:
Especifica el tipo de comunicación deseada
( STREAM, DATAGRAMA,etc ).

PROTOCOLO: Especifica el protocolo especifico a utilizar
(Suele usarse “0” para que el sistema elija el
más conveniente dentro de la familia).
Funciones utilizadas:

Conexión a máquina local ( asignar puerto):
 bind
( socket, local_addr, addrlen )
 socket :
Descriptor del socket involucrado.

local_addr : Estructura que especifica la dirección local

addrlen :
Entero que especifica el largo de la dirección
local, medida en bytes.
Funciones utilizadas:

Conexión a máquina remota:
 connect
( socket, dir_dest, largo )
 socket :

dir_dest :
Descriptor del socket involucrado.
Estructura que especifica la dirección remota a
la cual se conectará el socket.

largo
:
Entero que especifica el largo de la dirección
remota, medida en bytes.
Funciones utilizadas:

Recepción y envío de información:
 write
( socket, buffer, largo ).
 read (socket, buffer, largo ).

socket: Es el descriptor del socket involucrado.

buffer: Indica la dirección en memoria donde comienza el
buffer (datos a transmitir o donde se guardarán los
datos leidos según sea el caso).

largo: Indica el largo del buffer tanto de lectura como de
escritura.
Funciones utilizadas:

Cierre del socket:
 close
( socket )
 socket :
Descriptor del socket involucrado.
Funciones utilizadas:

Especificar largo de la cola de clientes en
espera del servidor:
 listen
( socket, nmc )
 socket :
Descriptor del socket involucrado.
 nmc:
Nº máximo de conexiones que
quedarán en espera de ser
atendidos por el servidor.
Funciones utilizadas:

Aceptar conexión de cliente al servidor:
 accept
( socket, p_addr, p_lgadr )
 socket :
Descriptor del socket involucrado.
 p_adr
Dirección del socket conectado.

:
p_lgadr :
Puntero al tamaño de la zona reservada
a p_adr.
Funciones utilizadas:

Rutinas para convertir datos:
 localshort=ntohs(netshort)
 locallong=ntohl(netlong)
 netshort=htons(locallong)
 netlong=htonl(locallong)
Descargar

LABORATORIO DE ESTRUCTURA DE COMPUTADORES II