Publicado el 10 de Junio del 2021
700 visualizaciones desde el 10 de Junio del 2021
293,0 KB
23 paginas
Creado hace 10a (15/01/2015)
Programación en Internet
(Sockets)
Programación con Sockets
Objetivo: aprender como construir aplicaciones
cliente/servidor que se comunican utilizando sockets
Socket API
•
introducida en el BSD4.1
UNIX, 1981
• explicitamente creada,
utilizada, por aplicaciones
paradigma cliente/servidor
• dos tipos de servicio de
transporte via el API de
socket:
– datagrama no fiable
– flujo de bytes fiable
socket
Una interfaz de aplicación
creada, tenida y
controlada por el OS (una
“puerta”) dentro de la
cual los procesos pueden
enviar y recibir mensajes
a/desde otro proceso
(remoto o local).
1
Sockets en UNIX
• Una forma de comunicarse con otro proceso
usando descriptores de ficheros estándares
(recordar: todo en UNIX es un fichero)
• Como todo descriptor de ficheros es un int
BSD socket
INET socket
TCP/UDP
Appletalk
IPX
IP
3
(Link)
(Physical)
Struct sockaddr
• Almacena información de la dirección del socket
struct sockaddr {
unsigned short sa_family;
char sa_data[14];
// address family, AF_xxx
// 14 bytes of protocol address
};
•
Familia de direcciones soportadas (include/linux/socket.h)
– UNIX
– INET
– AX25
– IPX
– APPLETALK
– X25
Unix domain sockets
TCP/IP
Amateur radio
Novell IPX
Appletalk
X.25
• Mas; unas 24 en total
•
Para INET, sa_family = AF_INET
2
Network Byte Order vs. Host Byte Order
• Existen dos formas de ordenar los bytes:
– El más significativo primero: Network Byte Order o "Big-Endian Byte
Order"
– El menos significativo primero: Host Byte Order o “Little-Endian Byte
Order"
• Se puede convertir de un orden a otro usando las funciones:
– htons()
: Host to Network short
– htonl()
: Host to Network long
– ntohs()
: Network to Host short
– ntohl()
: Network to Host long
• Siempre debe convertirse los datos a Network Byte Order
antes de enviarlos por la red
Struct sockaddr_in
• Sockaddr para TCP / IP
struct sockaddr_in {
short int sin_family;
// Address family
unsigned short int sin_port;
// Port number
struct in_addr sin_addr;
// Internet address
unsigned char sin_zero[8];
// Same size as struct sockaddr
};
• A un puntero a struct sockaddr_in puede hacérsele casting a struct
sockaddr y viceversa
•
•
sin_family se corresponde con sa_family en struct sockaddr
sin_port y sin_addr deben estar en Network Byte Order
5
6
3
struct in_addr sin_addr
• Dirección Internet (dirección IP)
struct in_addr {
unsigned long s_addr; // that’s a 32-bit long, or 4 bytes
};
• De esta forma si se declara ina del tipo type struct sockaddr_in, entonces
ina.sin_addr.s_addr referencia la dirección IP de 4 bytes (en Network
Byte Order).
7
Programación de Sockets utilizando
Socket: una puerta entre procesos de aplicación y el
TCP en Java
protocolo de transporte extremo a extremo (UCP o
TCP)
Servicio TCP: trasnferencia fiable de bytes desde un
proceso a otro
Controlado por el
desarrollador de
la aplicación
Controlado por el
sistema operativo
proceso
socket
TCP con
buffers,
variables
host o
servidor
internet
Controlado por el
desarrollador de
la aplicación
Controlado por el
sistema operativo
proceso
socket
TCP con
buffers,
variables
host o
servidor
4
Sockets
Aplicación
Presentación
Sesión
Transporte
Red
Enlace
Física
Aplicación
Presentación
Sesión
Transporte
Red
Enlace
Física
OSI Model, DoD Model and TCP/IP Protocol Suit
DoD: Department of Defense
5
Programación de Sockets utilizando
TCP
El cliente debe contactar al
servidor
El proceso servidor debe correr
primero
El servidor debe haber creado
algún socket (puerta) que reciba
conexiones de clientes
El cliente contacta al servidor
mediante:
Crear un socket TCP local al
cliente
Especificar la dir. IP, el puerto
del proceso servidor
Cuando el cliente crea un socket: el
cliente TCP establece una conexión
al servidor TCP
Cuando el servidor es contactado
por un cliente, el servidor TCP crea
un nuevo socket para que el proceso
servidor se comunique con el cliente
permite que el servidor hable con
múltiples clientes
Punto de vista de la aplicación
El TCP provee de una
transferencia de bytes (“pipe”)
fiable y en orden entre el
clienteyelservidor
Programación de Sockets utilizando
TCP
keyboard
monitor
Ejemplo aplicación cliente-
servidor:
• El cliente lee una línea de la
entrada estándar (inFromUser
stream) , y la envía al servidor
vía el socket (outToServer
stream)
• El servidor lee la línea del
desde el socket
• El servidor convierte la línea en
mayusculas y la envía al cliente
• El cliente lee e imprime la línea
modificada desde el socket
(inFromServer stream)
input
stream
r
e
s
U
m
o
r
F
n
i
Proceso
Process
Cliente
flujo de salida:
Secuencia de bytes
hacia fuera del
proceso
output
stream
flujo de entrada:
Secuencia de
bytes hacia dentro
del proceso
r
e
v
r
e
S
o
T
u
o
t
input
stream
r
e
v
r
e
S
m
o
r
F
n
i
client TCP
clientSocket
socket
TCP
socket
to network
from network
6
Interacción cliente/servidor con Socket
Servidor (corriendo sobre hostid)
Cliente
TCP
create socket,
port=x, for
incoming request:
welcomeSocket =
ServerSocket()
TCP
inicio de conexión
Esperando por
solicitud de conexión
connectionSocket =
welcomeSocket.accept()
Lee solicitud de
connectionSocket
Escribe respuesta a
connectionSocket
cierra
connectionSocket
crea socket,
connect to hostid, port=x
clientSocket =
Socket()
envía solicitud en
clientSocket
Lee contestación en
clientSocket
cierra
clientSocket
Programación de Sockets con UDP
Punto de vista de la aplicación
UDP provee una transferencia no
fiablede grupos de bytes
(datagramas) entre el cliente y el
servidor
UDP: sin “conexión” entre el
cliente y el servidor
•
sin handshaking (saludo)
• El emisor asocia
explicitamente la dir. IP y
el puerto del destinatario
• El servidor debe extraer
del datagrama recibido, la
dir. IP y el puerto del
emisor
UDP: los datos transmitidos
pueden ser recibidos fuera
de orden, o se pueden
perder
7
Interacción cliente/servidor de sockets
Servidor (corriendo en hostid)
Cliente
UDP
crea socket,
port=x, para
solicitud entrante:
serverSocket =
DatagramSocket()
Lee solicitud desde
serverSocket
Escribe respuesta a
serverSocket
especificando la dir. del
hots y el num. de puerto
crea socket,
clientSocket =
DatagramSocket()
crea, dirección (hostid, port=x)
Envía datagrama de petición
utilizando clientSocket
Lee respuesta en
clientSocket
cierra
clientSocket
Ejemplo: cliente (UDP)
keyboard
monitor
input
stream
Proceso
Process
Cliente
salida: envía paquete
(TCP envía “flujo
de bytes”)
UDP
packet
r
e
s
U
m
o
r
F
n
i
t
e
k
c
a
P
d
n
e
s
entrada: recibe
paquete (TCP
recibe “flujo de
bytes”)
t
e
k
c
a
P
e
v
e
c
e
r
i
UDP
packet
client UDP
clientSocket
socket
UDP
socket
to network
from network
8
Sockets
• Protocolos de Transporte:
XNS
TCP/IP
UNIX
• Tipos de Servicios
Datagramas: SOCK_DGRAM
Circuitos Virtuales:
• SOCK_STREAM
• SOCK_SECPACKED
• Especiales: SOCK_RAW
Sockets
• Un socket está caracterizado por 5
parámetros :
Una familia de protocolos
La dirección IP de la máquina local
El puerto de la capa de transporte
La dirección IP de la máquina remota
El puerto de la capa de transporte remota
• Los cinco parámetros arriba mencionados
son necesarios para establecer una
comunicación.
9
Sockets: Llamados al Sistema
socket
bind
listen
accept
connect
send/write
recv/read
sendto
recvfrom
select
close
Crea un socket del tipo especificado (Stream, Datagrama, o Especial).
Asocia una dirección IP, un puerto de la capa de transporte y una familia
de protocolos.
Crea una cola de peticiones de conexión.
Acepta una petición de conexión solicitada por un cliente. En caso de no
existir se duerme en espera de una. Al salir crea un socket completo.
Invita a establecer conexión con un socket remoto perteneciente a un
servidor .
Envía datos a través del socket (circuitos virtuales)
Recibe datos a través del socket (circuitos virtuales)
Envía datos a través del socket (datagramas)
Recibe datos a través del socket (datagramas)
Revisa el estado de varios sockets abiertos para lectura ó escritura
Termina la conexión en un socket.
Sockets: Escenario Típico de
Comunicación (Serv. Sin conexión)
SERVIDOR
socket()
bind()
recvfrom()
<petición>
sendto()
close()
<respuesta>
CLIENTE
socket()
bind()
sendto()
recvfrom()
close()
10
Sockets: Escenario Típico de Comunicación
(Serv. Orientado a Conexión)
SERVIDOR
socket()
bind()
listen()
accept()
recv()
send()
close()
CLIENTE
socket()
connect()
send()
recv()
close()
Fase
Establecimiento
De Conexión
Fase
Intercambio
Fase
Desconexión
Sockets: Servidor Concurrente
Clientes
Servidores
C1
C2
Cn
S1
S2
Sn
Vigía
11
Sockets: Servidor Concurrente
(a) Cliente y Servidor solicitan un socket al sistema
socket()
(b) El Servidor se asocia a un puerto conocido
bind()
Sockets: Servidor Concurrente
(c) El Servidor reserva cola de espera e indica que está listo y
se bloquea esperando conexiones (pasivo)
listen()
accept()
(d) El Cliente solicita conexión a la dirección bien conocida
del Servidor. El sistema le asigna un puerto libre.
connect()
12
Sockets: Servidor Concurrente
(e) Al aceptar la conexión, el Servidor crea un nuevo socket que
le heredará al proceso de atención
(f) El Servidor crea un nuevo proceso que atenderá la petición
fork()
Sockets: Servidor Concurrente
(g) El proceso hijo cierra el socket de petición de servicio
y ofrece el servicio a través del nuevo socket.
(h) Por su parte, el padre cierra el nuevo socket y regresa
a esperar una nueva conexión.
13
Anexo: Ejemplos de programas con
Sockets
En este anexo se presentan ejemplos de programas
cliente-servidor. Los servicios son:
con
Servicio
minúsculas a mayúsculas
eco
de
transformación
de
Comentarios de: Programación en Internet (Sockets) (0)
No hay comentarios