Publicado el 8 de Abril del 2018
618 visualizaciones desde el 8 de Abril del 2018
268,3 KB
14 paginas
Creado hace 13a (25/04/2011)
Introduccióónn al al usouso de de
Introducci
SOCKETS en Linux
SOCKETS en Linux
Lic. Leonardo de - Matteis
Departamento de Ciencias e Ingeniería de la Computación
Universidad Nacional del Sur
© 2011
Interfaz de de programaci
Interfaz
programacióónn de de aplicaciones
aplicaciones
NAPI (Network Application Programming Interface)
Servicios provistos usualmente por el sistema operativo, los cuales
brindan una interface entre componentes de software en la capa de
aplicación y protocolos de red específicos.
2
1
APIs parapara comunicaci
APIs
comunicacióónn vvííaa TCP/IP
TCP/IP
NAPI (Network Application Programming Interface)
• Los protocolos de transporte TCP/UDP no incluyen la definición de
una API específica.
• Existen diversas APIs que se pueden utilizar con TCP/IP:
Sockets
Sockets (BSD: Berkeley sockets)
TLI, XTI (AT&T UNIX System V)
Winsock (Microsoft, pero basado en BSD sockets)
MacTCP (Mac OS, Apple Computer)
Open Transport (Mac OS, Apple Computer)
3
Socket: definici
Socket:
definicióónn
Representación abstracta de un punto de comunicación, que permite
establecer un canal de comunicación entre dos rutinas o programas.
• Los podemos considerar como archivos, que se crean de manera
especial.
socketstrabajan con los servicios de entrada/salida de sistemas
• Los sockets
operativos del tipo Unix.
•Diversos programas corriendo en computadoras diferentes dentro de
sockets.
una red, pueden comunicarse a través del uso de sockets
• Con las funciones write() y read() del lenguaje C, se pueden escribir
socket.
y leer datos en el socket
4
2
Sockets (BSD: Berkeley sockets)
Sockets (BSD: Berkeley sockets)
• Primera versión disponible en el Unix BSD 4.2 (1983).
• API basada en librerías, para escribir programas en C.
• Permiten escribir rutinas para la intercomunicación entre procesos.
• Brindan generalidad:
soportan multiples familias de protocolos;
independencia en la representación de las direcciones.
• Utiliza la interface de programación de entrada/salida existente lo
más posible.
• API standard para la utilización de sockets
socketsen redes.
• Otros lenguajes utilizan una API similar.
5
Tipos de sockets
de sockets
Tipos
sockets, los
Existen dos tipos de "canales de comunicación" o sockets
orientados a conexión y los no orientados a conexión.
Orientados a conexión (TCP):
Dos programas deben conectarse entre ellos con un socket
establecida correctamente la conexión, ninguno de los dos puede transmitir
datos. (Protocolo TCP sobre IP).
sockety hasta que no esté
Esto garantiza que todos los datos van a llegar de un programa al otro
correctamente. Se utiliza cuando la información a transmitir es importante, y no
se debe perder ningún dato.
Si uno de los programas está "ocupado" y no atiende la comunicación, el otro
quedará bloqueado hasta que el primero lea o escriba los datos en el canal.
6
3
Tipos de sockets
de sockets
Tipos
Sin conexión (UDP):
No es necesario que los programas se conecten. Cualquiera de ellos puede
transmitir datos en cualquier momento, independientemente de que el otro
programa esté "escuchando" o no.
Para esto se utiliza el protocolo UDP sobre IP, y garantiza que los datos que
lleguen sean correctos, pero no garantiza que lleguen todos.
Programas: : servidor
Programas
servidor y y cliente
cliente
Servidor: es el programa que permanece pasivo a la espera de que alguien
solicite conexión. Puede o no devolver datos.
Cliente: es el programa que solicita la conexión para enviar o solicitar datos al
servidor.
Arquitectura cliente/servidor
cliente/servidor
Arquitectura
7
8
4
Construccióónn del del server
server
Construcci
socket:
1) Creación del socket
Función: socket()
Es una llamada al sistema, esta función devuelve un descriptor de archivo, al igual
que la función open() al crear o abrir un archivo .
Durante la llamada se reservan los recursos necesarios para el punto de
comunicación, pero no se especifica nada con respecto a la dirección asociada al
mismo.
Librerías requeridas y parámetros en Linux:
9
Construccióónn del del server
server
Construcci
socket:
1) Creación del socket
Prototipo: int socket (int family, int type, int protocol);
family: especifica la familia del protocolo (PF_INET para TCP/IP).
type: especifica el tipo de servicio (SOCK_STREAM, SOCK_DGRAM).
protocol: especifica el protocolo (usualmente 0, lo cual significa el protocolo por
defectopara la familia elegida).
Resultado:
La llamada al sistema socket() devuelve un descriptor (número de tipo small integer)
o -1 si se produjo un error.
El descriptor de archivo luego será usado para asociarlo a una conexión de red.
10
5
Construccióónn del del server
server
Construcci
socket:
2) Asociar una dirección al socket
función bind()
Llamada al sistema que permite asignar una dirección a un socket
socketexistente.
El sistema no atenderá a las conexiones de clientes, simplemente registra que cuando
empiece a recibirlas le avisará a la aplicación.
En esta llamada se debe indicar el número de serviciosobre el que se quiere atender.
11
Construccióónn del del server
server
Construcci
socket:
2) Asociar una dirección al socket
Prototipo: int bind (int sockfd, const struct sockaddr *myaddr, int addrlen);
*myaddr: asigna la dirección especificada en la estructura del tipo sockaddr. En
este parámetro suele utilizarse una estructura del tipo sockaddr_in (ejemplo en
transparencia 20).
sockfd: descriptor del socket
socketinvolucrado.
addrlen: tamaño de la estructura en *myaddr, es decir sizeof(myaddr).
Resultado:
La llamada al sistema bind() devuelve un 0, si se produjo un error devuelve -1.
12
6
Construccióónn del del server
server
Construcci
3) Atender conexiones:
función listen()
Avisar al sistema operativo que comience a atender la conexión de red.
El sistema registrará la conexión de cualquier cliente para transferirla a la aplicación
cuando lo solicite.
Si llegan conexiones de clientes más rápido de lo que la aplicación es capaz de
atender, el sistema almacena en una cola las mismas y se podrán ir obteniendo
luego.
13
Construccióónn del del server
server
Construcci
4) Aceptar conexiones:
función accept()
Pedir y aceptar las conexiones de clientes al sistema operativo. El sistema operativo
entregará el siguiente cliente de la cola. Si no hay clientes se quedará bloqueada
hasta que algún cliente se conecte.
14
7
Construccióónn del del server
server
Construcci
5) Leer datos desde una conexión:
función read()
Recibir datos a través del descriptor del socket
socket.
El cliente y el servidor deben conocer que datos esperan recibir, y cuales deben
enviar, bajo un formato determinado.
15
16
Construccióónn del del server
server
Construcci
6) Escribir datos en la conexión:
función write()
Escribir datos a través del descriptor del socket
socket.
7) Cerrar la conexión:
función close()
Cierra el descriptor del socket
socket.
8
Construccióónn del del cliente
cliente
Construcci
socket
1) Creación del socket
función socket()
Esta función devuelve un descriptor de archivo, al igual que la función open() al crear
o abrir un archivo .
2) Conectar con el servidor:
función connect()
Iniciar/solicitar una conexión con el servido. Dicha función quedará bloqueada hasta
que el servidor acepte nuestra conexión.
Si no hay servidor que atienda, se obtendrá un código de error (-1).
Se debe especificar la dirección IP del servidor y el número de puerto (servicio) al que
se desea conectar.
Construccióónn del del cliente
cliente
Construcci
3) Conectar con el servidor:
función connect()
17
18
9
Construccióónn del del cliente
cliente
Construcci
5) Escribir datos en la conexión:
función write()
Escribir datos a través del descriptor del socket
socket.
6) Leer datos desde una conexión:
función read()
Recibir datos a través del descriptor del socket
socket.
El cliente y el servidor deben conocer que datos esperan recibir, y cuales deben
enviar, bajo un formato determinado.
7) Cerrar la conexión:
función close()
Cierra el descriptor del socket
socket.
19
Sinopsis
Sinopsis
Estructuras y variables para el servidor:
extern int errno;
extern char *sys_errlist[];
int
struct sockaddr_in server;
sockfd;
/* Estructura con datos del server */
bzero(&server, sizeof(server));
server.sin_family
server.sin_addr.s_addr = INADDR_ANY;
server.sin_port
= AF_INET;
= htons((short) portnum);
//server.sin_addr = htonl(ipaddress); /* dirección IP específica */
20
10
Sinopsis
Sinopsis
Algoritmo básico para el servidor:
/* Obtener un descriptor de archivo para el socket */
if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror ("error al querer abrir el socket\n");
exit(1);
}
/* Asociar el programa al socket */
if (bind(sockfd, (struct sockaddr*)&server, sizeof(server))) {
perror("no se pudo hacer el bind");
exit(1);
}
/* Aceptación de conexiones en modo pasivo */
if (listen(sockfd, 5) < 0) {
printf("No se puede oir en el port %d : %s\n", portnum,
sys_errlist[errno]);
exit(1);
}
.
.
close(sockfd);
Sinopsis
Sinopsis
Estructuras y variables para el cliente:
int sockfd;
struct sockaddr_in server;
struct hostent *server_host;
/* Estructura con datos del server */
bzero(&server, sizeof(server));
server.sin_family
bcopy(server_host -> h_addr,
= AF_INET;
&server.sin_addr,
server_host -> h_length);
server.sin_port = htons((short) SERVER_PORT);
21
22
11
Sinopsis
Sinopsis
Algoritmo básico para el cliente:
/* Obtener un descriptor de archivo para el socket */
if ((sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) < 0) {
perror ("error al querer abrir el socket\n");
exit(1);
}
/* connect to server, which should already be setup */
if (connect(sockfd, (struct sockaddr*) &server, sizeof(server)) < 0) {
perror(“error al querer establecer la conexión con el server");
exit(1);
}
/ * obtener datos del host a través de su nomb
Comentarios de: Introducción al uso de sockets en Linux (0)
No hay comentarios