]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/practica3/parte1/client.cpp
Ya estamos fragmentando! (falta testing intensivo pero parece andar)
[z.facultad/75.74/practicos.git] / practicas / practica3 / 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.size());
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                     || libtcp_send(sockfd, token.c_str(), token.size()) != token.size())
97             {
98                 print_msg(stderr, "%s (%d): error en envio sobre el socket\n", pname, pid);
99                 exit(1);
100             }
101         }
102         Protocol proto(type, 1, client_id, 0);
103         if (libtcp_send(sockfd, (char*) &proto, sizeof(Protocol)) != sizeof(Protocol))
104         {
105             print_msg(stderr, "%s (%d): error en envio sobre el socket\n", pname, pid);
106             exit(1);
107         }
108         // Esperando respuesta del servidor con el resultado
109         int response;
110         int n = libtcp_receive(sockfd, (char*) &response, sizeof(response));
111         if (n < 0)
112         {
113             print_msg(stderr, "%s (%d): error en recibir\n", pname, pid);
114         }
115         else
116         {
117             print_msg(stdout, "%s (%d): el server responde %d\n", pname, pid, response);
118         }
119     }
120
121     Protocol proto(Protocol::QUIT, 1, client_id, 0);
122     if (libtcp_send(sockfd, (char*) &proto, sizeof(Protocol)) != sizeof(Protocol))
123     {
124         print_msg(stderr, "%s (%d): error en envio sobre el socket\n", pname, pid);
125         exit(1);
126     }
127
128     /* Limpio y salgo */
129     close(sockfd);    
130     return EXIT_SUCCESS;
131 }
132
133 // vim: set et sw=4 sts=4 :