UNIVERSIDAD NACIONAL DE SAN AGUSTÍN
FACULTAD DE INGENIERÍA DE PRODUCCIÓN Y
SERVICIOS
ESCUELA PROFESIONAL DE INGENIERÍA DE SISTEMAS
Sistemas Distribuidos
Laboratorio 03
Presentado por:
Mejia Huayhua Jose Carlos
Docente:
Jesus Martin Silva Fernandez
Arequipa – Perú
Abril-2020
I. Objetivo
Conocer y utilizar de manera adecuada el componente socket para la
interoperabilidad entre dos o más procesadores, utilizando sus diferentes
características (hilos).
II. Descripción del procedimiento realizado en la práctica
III. Resultados obtenidos
1. Ejemplos 1 y 2
● Ejemplo 1
-Servidor
no muestra nada porque no presento ningun error
-Cliente
● Ejemplo 2
-Servidor
-Cliente
2. Chat
3. Actividades propuestas
IV. Análisis de resultados
1. Ejemplo 1 y 2
● Ejemplo 1
En este ejemplo representa un ejemplo sencillo de cliente
servidor, en donde una vez levantado el servidor(si esto ocurre
no mostrará ningún mensaje) esperará a un cliente, una vez el
servidor acepte al cliente, esperará a que el cliente escriba
algo, si es asi el servidor devolverá lo mismo que escribio el
cliente en una especie de chat unilateral, es un ejemplo muy
sencillo pero practico y facil de entender.
● Ejemplo 2
Este ejemplo es un poco más complejo que el anterior puesto
que introducimos lo que son los hilos, una vez levantado el
servidor esperaremos a un cliente y conforme vayan llegando
los clientes iremos creando un servidor hilo, en este es donde
identificamos al cliente con un id de sesión y implementaremos
la interacción por cada cliente identificando las palabras clave
hola y adiós con las que funcionara la interacción.
Luego de lado del cliente tenemos a la clase Persona la cual
extenderá de Thread tambien, osea que cada persona será un
hilo, en esta clase implementaremos la interacción del lado del
cliente, pero en lugar de darle la disponibilidad de escribir al
cliente, automatizamos para que este una vez creado el objeto,
de frente salude y provoque la despedida de parte del
servidor. En el lado del cliente crearemos una lista de cinco
Personas y las inicializamos originando la salida que vimos
anteriormente en la parte de pruebas.
2. Chat
Este ejercicio se trata de comunicación entre clientes con interfaz
visual.
3. Actividades Propuestas
Modificar, ejecutar y probar chat en C
-Servidor
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netbd.h>
#include <unistd.h>
#include <string.h>
#define PORTNUMBER 12563
int main(void) {
char buf[1024];
int s, n, ns, len;
struct sockaddr_in name;
/* Se crea el socket */
s = socket (PF_INET, SOCK_STREAM, 0);
name.sin_family = AF_INET;
name.sin_port = htons(PORTNUMBER);
name.sin_addr.s_addr =htonl(INADDR_ANY);
len = sizeof(struct sockaddr_in);
/*Se publica la dirección y el puerto por el que
se va a escuchar*/
bind(s,(struct sockaddr *)&name, len);
/*Escucha de peticiones*/
listen(s,5);
/*aceptar conexiones*/
ns= accept(s, (struct socket *)&name, &len);
memset(&buf, '\0', sizeof(buf));
/*Se lee el socket hasta el final del fichero*/
while((n = recv(ns, buf, sizeof(buf), 0))>0)
/*se imprime lo que vayas leyendo*/
printf("%s",buf);
/*se cierran las conexiones*/
close(ns);
close(s);
return(EXIT_SUCCESS);
}
-Cliente
#include <stdio.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netbd.h>
#include <unistd.h>
#include <string.h>
#define PORTNUMBER 12563int main(void) {
int n,s, len;
char buf[1024];
char hostname[64];
struct hostent *hp;
struct sockaddr_in name;/*nombre del host local*/
gethostname(hostname, sizeof(hostname));/*direccion de red del
host local*/
hp = gethostbyname(hostname);/*se crea el socket*/
s = socket(PF_INET, SOCK_STREAM, 0);
name.sin_family = AF_INET;
name.sin_port = htons(PORTNUMBER);/*Se asigna direccion IP*/
memcpy(&name.sin_addr, hp->h_addr_list[0], hp->h_length);
len=sizeof(struct sockaddr_in);/*Se conecta al servidor*/
connect(s, (struct sockaddr *) &name, len);/*Se leen
caracteres del teclado*/
while( (n = read (0, buf, sizeof(buf)))>0)
/*Se copian los datos al socket*/
send(s,buf,n,0);
/*Se cierra el socket*/
close(s);
return(EXIT_SUCCESS);
}
Pruebas de Compilación
Cuestionario
Indicar ventajas de socket TCP y UDP
UDP: Rápido y seguro.
En comparación con el protocolo TCP, el protocolo UDP elimina el mecanismo
confiable de transmisión de información, es decir, reduce el consumo de tiempo
requerido para el proceso de proporcionar agrupación, ensamblaje y
secuenciación de paquetes en el protocolo TCP. En segundo lugar, UDP es un
protocolo de transporte sin estado, por lo que es muy rápido al pasar datos. Sin
estos mecanismos TCP, UDP tiene menos vulnerabilidades que los atacantes
TCP.
TCP: Confiabilidad
1. Cuando TCP envía un segmento, inicia un temporizador y espera a que el
destino acuse recibo de este segmento.
2.TCP mantendrá una suma de verificación de su encabezado y datos. Esta es
una suma de verificación de extremo a extremo, el propósito es detectar cualquier
cambio en los datos durante la transmisión.
3. Dado que los segmentos TCP se transmiten como datagramas IP, y la llegada
de datagramas IP puede estar fuera de servicio, la llegada de segmentos TCP
también puede estar fuera de servicio. 4. El receptor TCP debe descartar datos
duplicados
5. Control de volumen. Cada lado de la conexión TCP tiene un espacio de búfer
de tamaño fijo
¿Cuál es la complejidad de la aplicación chat?
Esta aplicación posee una complejidad alta, ya que tenemos que emplear
sockets y hilos para lograr modelar el correcto funcionamiento de un chat
que el servidor reciba los mensajes y los envíe a sus destinatarios.
Indique la lógica para agregar un adjunto en chat?
Se refiere a gregar un archivo adjunto, este puede ser un archivo de texto,
documento, imagen, video, audio y demás. esto dependerá mucho del peso
de este archivo, algunas aplicaciones de chat permiten más que otras.
Una de las lógicas que emplean, es partirlo en varios paquete de datos, con
algo que los identifique y con lo que sea fácil la reestructuración al otro
lado.
V. Conclusiones
-Los sockets son un tópico muy importante en sistemas distribuidos
-La forma en cómo c maneja sockets es muy diferentes a la forma que tiene
java.