]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica3/parte1/serverhandler.cpp
Ya estamos fragmentando! (falta testing intensivo pero parece andar)
[z.facultad/75.74/practicos.git] / practicas / practica3 / 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 linea[256];
18     char fin = 0, fin_cmd = 0;
19     int result = 0;
20     std::set< std::string > set;
21
22     pname = argv[0];
23     pid = getpid();
24
25     /* Verifico parametros de linea de comando */
26     if (argc > 1)
27         sockfd = atoi(argv[1]);
28     else
29     {
30         perror("Falta parametro con fd");
31         exit (1);
32     }
33
34     print_msg(stdout, "%s (%d): atendiendo a cliente por socket %d\n", pname, pid, sockfd);
35
36     while (!fin)
37     {
38         std::string buffer;
39         while (!fin_cmd)
40         {
41             Protocol proto;
42             int n = libtcp_receive_bin(sockfd, (char*) &proto, sizeof(Protocol));
43             if (n < 0)
44             {
45                 print_msg(stdout, "%s (%d): error en recibir\n", pname, pid);
46                 exit(1);
47             }
48             print_msg(stdout, "%s (%d): cliente %d envio operacion (%d, %d, %d)\n",
49                     pname, pid, proto.client_id, proto.type, proto.end, proto.len);
50
51             n = libtcp_receive_bin(sockfd, linea, proto.len);
52             if (n < 0)
53             {
54                 print_msg(stdout, "%s (%d): error en recibir\n", pname, pid);
55                 exit(1);
56             }
57             linea[proto.len] = '\0';
58             print_msg(stdout, "%s (%d): se recibieron %d bytes de payload (%s)\n",
59                     pname, pid, proto.len, linea);
60             buffer += linea;
61             print_msg(stdout, "%s (%d): buffer: %s\n", pname, pid, buffer.c_str());
62
63             if (proto.end)
64             {
65                 switch (proto.type)
66                 {
67                     case Protocol::PUT:
68                         if (set.find(buffer) == set.end())
69                         {
70                             set.insert(buffer);
71                             result = Protocol::OK;
72                         }
73                         else
74                             result = Protocol::EXISTS;
75                         break;
76                     case Protocol::FIND:
77                         if (set.find(buffer) == set.end())
78                             result = Protocol::NOT_FOUND;
79                         else
80                             result = Protocol::OK;
81                         break;
82                     case Protocol::DEL:
83                         if (set.erase(buffer))
84                             result = Protocol::OK;
85                         else
86                             result = Protocol::NOT_FOUND;
87                         break;
88                     case Protocol::QUIT:
89                         result = Protocol::OK;
90                         print_msg(stdout, "%s (%d): Say no more\n", pname, pid);
91                         fin = 1;
92                         fin_cmd = 1;
93                         break;
94                     default:
95                         print_msg(stderr, "%s (%d): Operacion no soportada\n", pname, pid);
96                 }
97                 buffer.clear();
98                 fin_cmd = 1;
99             }
100         }
101         fin_cmd = 0;
102
103         // Envío respuesta
104         libtcp_send(sockfd, (char*) &result, sizeof(int));
105         print_msg(stdout, "%s (%d) FIN (resultado = %d)\n", pname, pid, result);
106     }
107
108     close(sockfd);
109
110 }
111
112 // vim: set et sw=4 sts=4 :