]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica3-corregida/parte1/client.cpp
Cosas de Distribuidos I.
[z.facultad/75.74/practicos.git] / practicas / practica3-corregida / parte1 / client.cpp
1 /*
2  * Cliente que envía operaciones al hash del servidor.
3  */
4
5 #include "libtcp.h"
6 #include "common.h"
7 #include "protocol.h"
8 #include <string>
9 #include <sstream>
10 #include <iostream>
11
12 int main(int argc, char *argv[])
13 {
14     int sockfd;
15     int client_id;
16     char *server_name;
17     char *localhost = "localhost";
18     pid_t pid;
19     int port;
20     const char *pname = argv[0];
21
22     // mostrar el pid del cliente
23     pid = getpid();
24     print_msg(stdout, "%s Cliente con pid = %d\n", pname, pid);
25
26     // Verifico parametros de linea de comandos
27     if (argc > 2) 
28         port = atoi (argv[2]);
29     else
30         port = LIBTCP_DEFAULT_TCP_PORT;
31
32     if (port <= 0)
33     {
34         // valor incorrecto: aviso y terminar
35         print_msg(stdout, "%s (%d): Nro. de port invalido %d\n", pname, pid, port);
36         exit(1);
37     }
38
39     if (argc > 1)
40         server_name = argv[1];
41     else
42         server_name = localhost;
43
44     // id del cliente, por default calculado en base al pid
45     if (argc > 3)
46         client_id = atoi(argv[3]);
47     else
48         client_id = pid % 32;
49
50     // Abro el socket
51     sockfd = libtcp_open_activo(server_name, port); 
52     if (sockfd < 0)
53     {
54         // ERROR
55         if (sockfd == -2)
56         {
57             print_msg(stdout, "%s (%d): Nombre de server no existe %s\n", pname, pid, server_name);
58             exit(1);
59         }
60         else
61         {
62             perror("Error al llamar a libtcp_open_activo");
63             exit(1);
64         }
65     }
66
67     std::string line;
68     Protocol::Type type;
69     while (std::getline(std::cin, line))
70     {
71         std::istringstream iss(line);
72         std::string token;
73         if (!(iss >> token)) return 0;
74         if (token == "put")
75         {
76             type = Protocol::PUT;
77         }
78         else if (token == "find")
79         {
80             type = Protocol::FIND;
81         }
82         else if (token == "del")
83         {
84             type = Protocol::DEL;
85         }
86         else
87         {
88             print_msg(stderr, "%s (%d): Invalid token %s!\n", pname, pid, token.c_str());
89             exit(1);
90         }
91         while (iss >> token)
92         {
93             Protocol proto(type, 0, client_id, token.c_str());
94             print_msg(stdout, "%s (%d): escribiendo %s\n", pname, pid, token.c_str());
95             if (libtcp_send(sockfd, (char*) &proto, sizeof(Protocol)) != sizeof(Protocol))
96             {
97                 print_msg(stderr, "%s (%d): error en envio sobre el socket\n", pname, pid);
98                 exit(1);
99             }
100         }
101         Protocol proto(type, 1, client_id, NULL);
102         if (libtcp_send(sockfd, (char*) &proto, sizeof(Protocol)) != sizeof(Protocol))
103         {
104             print_msg(stderr, "%s (%d): error en envio sobre el socket\n", pname, pid);
105             exit(1);
106         }
107         // Esperando respuesta del servidor con el resultado
108         int response;
109         int n = libtcp_receive(sockfd, (char*) &response, sizeof(response));
110         if (n < 0)
111         {
112             print_msg(stderr, "%s (%d): error en recibir\n", pname, pid);
113         }
114         else
115         {
116             print_msg(stdout, "%s (%d): el server responde %d\n", pname, pid, response);
117         }
118     }
119
120     Protocol proto(Protocol::QUIT, 1, client_id, NULL);
121     if (libtcp_send(sockfd, (char*) &proto, sizeof(Protocol)) != sizeof(Protocol))
122     {
123         print_msg(stderr, "%s (%d): error en envio sobre el socket\n", pname, pid);
124         exit(1);
125     }
126
127     /* Limpio y salgo */
128     close(sockfd);    
129     return EXIT_SUCCESS;
130 }
131
132 // vim: set et sw=4 sts=4 :