]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica3/README
Ya estamos fragmentando! (falta testing intensivo pero parece andar)
[z.facultad/75.74/practicos.git] / practicas / practica3 / README
1 ===============================
2 Sistemas Distribuidos I (75.74)
3 ===============================
4
5 -------------------------
6 Práctica de sockets y RPC
7 -------------------------
8
9 :Author: Leandro Lucarella (77891)
10
11 Organización
12 ============
13
14 La práctica se divide en componentes comunes y específicos:
15
16 common
17   Funciones comunes, para salida formateada usando write(2).
18
19 libtcp
20   Funciones generales de sockets.
21
22 parte1
23   Programas pertenecientes a la primera parte, el servidor iterativo concurrente
24   utilizando TCP. Se compone de 3 programas:
25
26   client
27     Programa cliente.
28
29   server
30     Servidor concurrente tipo inetd (hace un fork(2) para cada nueva conexión
31     llamando a serverhandler).
32
33   serverhandler
34     Servidor iterativo encargado de manejar la conexión.
35
36 parte2
37   Programas pertenecientes a la segunda parte, el servidor utilizando RPC
38   Se compone de 2 programas:
39
40   set_client
41     Programa cliente.
42
43   set_server
44     Servidor RPC con las funciones remotas.
45
46
47 Compilación
48 ===========
49
50 Para compilar los programas basta con usar `make`.
51
52
53 Uso
54 ===
55
56 Ambas versiones del programa se utilizan de igual forma. Hay que correr primero
57 el servidor y luego el cliente. El cliente toma la entrada del usuario por
58 entrada estándar. Se aceptan comandos del tipo::
59
60   OPERACION PARTE1 PARTE2 ... PARTEN
61
62 Donde OPERACION es: put, find o del. put agrega un string al set, enviando N
63 mensajes al servidor (uno por cada parte y enviando una marca de fin en el
64 último para que se procese), el string es la concatenación de todas las partes).
65 put devuelve 0 si tuvo éxito o 1 si ya había un string igual. find se fija si un
66 string determinado, retornando 0 si está o 1 si no. del elimina un string del
67 set, retornando 0 si se tuvo éxito o 1 si no se encontró.
68
69 El programa se detiene (enviando un comando QUIT) cuando se ingresa una línea
70 vacía o se cierra la entrada estándar.
71
72 Para hacer pruebas exhaustivas se provee de un script llamado test.sh (en ambas
73 variantes de la práctica) que corre varios clientes simultáneamente realizando
74 operaciones al azar. El servidor debe ser lanzado antes.
75
76
77 Protocolo TCP
78 =============
79
80 El protocolo tiene como objetivo manipular un set de datos (un conjunto de
81 strings) en el servidor. Hay 3 operaciones soportadas: PUT, FIND y QUIT. Cada
82 operación viene acompañada por un id de cliente, una marca de fin, y una
83 porcion del string a agregar/buscar/quitar. La operación se concreta recién al
84 recibir la última porción del string (indicado por la marca de fin) y el string
85 utilizado para la operación es la concatenación de las porciones recibidas en
86 cada mensaje. El paquete de "request" tienen entonces la siguiente estructura::
87
88   +----------+---------+----------+----------+---------------+
89   | type     | end     | clientid | lenght   | payload (opt) |
90   +----------+---------+----------+----------+---------------+
91   /- 2 bits -/- 1 bit -/- 5 bits -/- 1 byte -/- 0-255 bytes -/
92
93
94 type
95   Es el tipo de mensaje: PUT (0), FIND (1), DEL (2), QUIT (3).
96
97 end
98   Marca de fin, indica cuando se está enviando la última porción de un comando.
99
100 clientid
101   Id del cliente.
102
103 lenght
104   Tamaño del payload en bytes.
105
106 payload
107   Fragmento del string que compone el comando.
108
109
110 Al recibir la última porción, el servidor procesa el pedido y envía una
111 respuesta con el resultado. El paquete de la respuesta se compone únicamente de
112 un int (entero de 4 bytes). Cada valor es un código de resultado. En general
113 siempre el valor 0 se usa para indicar operación exitosa. En caso de error los
114 siguientes resultados están definidos:
115
116 1
117   El string no existe
118
119 2
120   El string ya existe
121
122
123 Protocolo RPC
124 =============
125
126 Esta variante es prácticamente igual a la anterior sólo que se utilizan llamadas
127 a procedimientos remotos para enviar cada comando. La firma de estos
128 procedimientos (hay uno por cada comando o "type") es::
129
130   int prodedimiento(string payload, int end, int clientid);
131
132 A excepción del QUIT que sólo lleva como parámetro al clientid. Al ser cada
133 fragmento de un comando una llamada a procedimiento remoto, siempre se obtiene
134 un resultado, pero el resultado que vale es el de la última llamada (la que
135 lleva end en 1) ya que es en este momento cuando se realiza el procesamiento.
136 Para implementar esto se utilizaron archivos temporales para ir "acumulando" los
137 fragmentos del comando, utilizando un archivo por cada cliente conectado para
138 evitar "colisiones". Los códigos de retorno utilizados son los mismos que en la
139 variante anterior y toda la semántica del protocolo es también la misma.
140
141
142 .. vim: filetype=rst :