]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica3-corregida/parte1/serverhandler.cpp
Cosas de Distribuidos I.
[z.facultad/75.74/practicos.git] / practicas / practica3-corregida / parte1 / serverhandler.cpp
1 /*
2  * Servidor de hash
3  */
4
5 #include "libtcp.h"
6 #include "common.h"
7 #include "protocol.h"
8 #include <set>
9 #include <string>
10 #include <cstdlib>
11
12 int main(int argc, char *argv[])
13 {
14     char *pname;
15     int sockfd;/* socket que sirve como template */ 
16     pid_t pid; /* pid del server iterativo */
17     char fin = 0, fin_cmd = 0;
18     int result = 0;
19     std::set< std::string > set;
20
21     pname = argv[0];
22     pid = getpid();
23
24     /* Verifico parametros de linea de comando */
25     if (argc > 1)
26         sockfd = atoi(argv[1]);
27     else
28     {
29         perror("Falta parametro con fd");
30         exit (1);
31     }
32
33     print_msg(stdout, "%s (%d): atendiendo a cliente por socket %d\n", pname, pid, sockfd);
34
35     while (!fin)
36     {
37         std::string buffer;
38         while (!fin_cmd)
39         {
40             Protocol proto;
41             int n = libtcp_receive_bin(sockfd, (char*) &proto, sizeof(Protocol));
42             if (n < 0)
43             {
44                 print_msg(stdout, "%s (%d): error en recibir\n", pname, pid);
45                 exit(1);
46             }
47             print_msg(stdout, "%s (%d): cliente %d envio operacion (%d, %d, %s)\n",
48                     pname, pid, proto.client_id, proto.type, proto.end, proto.payload);
49
50             buffer += proto.payload;
51             print_msg(stdout, "%s (%d): buffer: %s\n", pname, pid, buffer.c_str());
52
53             if (proto.end)
54             {
55                 switch (proto.type)
56                 {
57                     case Protocol::PUT:
58                         if (set.find(buffer) == set.end())
59                         {
60                             set.insert(buffer);
61                             result = Protocol::OK;
62                         }
63                         else
64                             result = Protocol::EXISTS;
65                         break;
66                     case Protocol::FIND:
67                         if (set.find(buffer) == set.end())
68                             result = Protocol::NOT_FOUND;
69                         else
70                             result = Protocol::OK;
71                         break;
72                     case Protocol::DEL:
73                         if (set.erase(buffer))
74                             result = Protocol::OK;
75                         else
76                             result = Protocol::NOT_FOUND;
77                         break;
78                     case Protocol::QUIT:
79                         result = Protocol::OK;
80                         print_msg(stdout, "%s (%d): Say no more\n", pname, pid);
81                         fin = 1;
82                         fin_cmd = 1;
83                         break;
84                     default:
85                         print_msg(stderr, "%s (%d): Operacion no soportada\n", pname, pid);
86                 }
87                 buffer.clear();
88                 fin_cmd = 1;
89             }
90         }
91         fin_cmd = 0;
92
93         // Envío respuesta
94         libtcp_send(sockfd, (char*) &result, sizeof(int));
95         print_msg(stdout, "%s (%d) FIN (resultado = %d)\n", pname, pid, result);
96     }
97
98     close(sockfd);
99
100 }
101
102 // vim: set et sw=4 sts=4 :