]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/res.cpp
Cosas de Distribuidos I.
[z.facultad/75.74/practicos.git] / practicas / pipi / src / res.cpp
1
2 #include "ipout.h"
3 #include "ipin.h"
4 #include "ipaddr.h"
5 #include "routetable.h"
6 #include "devtcp.h"
7 #include "devque.h"
8 #include "resolver.h"
9 #include <iostream>
10 #include <fstream>
11 #include <sstream>
12 #include <string>
13 #include <cassert>
14 #include <unistd.h>
15 #include <fcntl.h>
16 #include <sys/types.h>
17 #include <sys/wait.h>
18 #include <sys/ipc.h>
19 #include <sys/msg.h>
20 #include <signal.h>
21
22 // Uso: ./ip ip [routes_file servers_file forward port]
23
24 void send_loop(Resolver& res);
25
26 int main(int argc, char* argv[])
27 {
28     bool forward = false;
29     uint16_t port = DEVTCP_DEFAULT_PORT;
30     std::string rfile = "route.txt";
31     std::string sfile = "resolver.txt";
32     if (argc < 2)
33     {
34         std::cerr << "Uso: " << argv[0] << " ip [routes_file servers_file "
35             "forward port]\n";
36         return 1;
37     }
38     IPAddr addr(argv[1]);
39     if (argc > 2)
40         rfile = argv[2];
41     if (argc > 3)
42         sfile = argv[3];
43     if (argc > 4)
44         forward = atoi(argv[4]);
45     if (argc > 5)
46         port = atoi(argv[5]);
47     // Abro archivos
48     std::ifstream rifs(rfile.c_str()); assert(rifs);
49     std::ifstream sifs(sfile.c_str()); assert(sifs);
50     // Creo medio físico y cola para forwarding
51     DevTCP dev(addr, port);
52     DevQue fwque(addr, DEVQUE_DEFAULT_KEY-1);
53     DevQue resresque(addr, DEVQUE_DEFAULT_KEY-5);
54     // Creo tabla de ruteo e IP
55     RouteTable table(dev);
56     add_routes(table, rifs, dev);
57     IPOut ipout(addr, table, fwque, std::cerr);
58     IPIn ipin(addr, dev, fwque, false, forward, std::cerr);
59     Resolver res(sifs, ipin, ipout, resresque);
60     // Creo procesos
61     pid_t pid_send = fork();
62     if (pid_send == -1)
63     {
64         perror("fork() send");
65         return 2;
66     }
67     if (pid_send) // IPOut
68     {
69         pid_t pid_fw = fork();
70         if (pid_fw == -1)
71         {
72             perror("fork() forward");
73             return 3;
74         }
75         if (pid_fw) // Padre (IPOut send)
76         {
77             int ret;
78             send_loop(res);
79             kill(pid_send, SIGTERM);
80             waitpid(pid_send, &ret, 0);
81             kill(pid_fw, SIGTERM);
82             waitpid(pid_fw, &ret, 0);
83             return 0;
84         }
85         else // Hijo 1 (IPOut forward)
86         {
87             ipout.forward_loop();
88             return 0;
89         }
90     }
91     else // Hijo 2 (IPIn)
92     {
93         res.recv_loop();
94         return 0;
95     }
96     return 0;
97 }
98
99 void send_loop(Resolver& res)
100 {
101     std::string name;
102     while (std::getline(std::cin, name))
103     {
104         std::cout << "Resolviendo " << name << "...\n";
105         Resolver::ipvec_t ips;
106         Resolver::result_t r = res.gethostbyname(name, ips);
107         switch (r)
108         {
109             case Resolver::OK:
110                 std::cout << "Encontrado: " << ips << "\n";
111                 break;
112             case Resolver::HOST_NOT_FOUND:
113                 std::cout << "No encontrado!\n";
114                 break;
115             case Resolver::NO_RECOVERY:
116                 std::cout << "Error irrecuperable!\n";
117                 break;
118             case Resolver::TRY_AGAIN:
119                 std::cout << "Error temporal, pruebe más tarde...\n";
120                 break;
121         }
122     }
123 }
124
125 // vim: set et sw=4 sts=4 :