]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/resolver.h
Bugfix al mostrar request/response para debug en send_loop().
[z.facultad/75.74/practicos.git] / practicas / pipi / src / resolver.h
1 #ifndef _RESOLVER_H_
2 #define _RESOLVER_H_
3
4 #include "devque.h"
5 #include "ipaddr.h"
6 #include "resolvproto.h"
7 #include <string>
8 #include <vector>
9 #include <map>
10 #include <istream>
11 #include <ostream>
12 #include <stdexcept>
13
14 /// Resolver de nombres
15 struct Resolver
16 {
17
18     /// Zonas para las que este servidor de nombres es autoridad
19     typedef ResolvProtoResponse::ipvec_t ipvec_t;
20     ipvec_t nameservers;
21
22     /// IP
23     IPIn& ipin;
24     IPOut& ipout;
25
26     /// Colas de recepción
27     DevQue& res_que;
28
29     /// Constructor
30     Resolver(std::istream& is, IPIn& ipin, IPOut& ipout, DevQue& res_que)
31             throw (std::runtime_error);
32
33     /// Resultado de la petición
34     enum result_t
35     {
36         OK,             ///> Respuesta válida
37         HOST_NOT_FOUND, ///> No se encuentra dicho host
38         NO_RECOVERY,    ///> Error irreparable (por ejemplo, no hay nameservers)
39         TRY_AGAIN       ///> Error temporal (por ejemplo, timeout)
40     };
41
42     /// Obtiene la(s) IP de un host a través de su nombre de dominio
43     result_t gethostbyname(const std::string& name, ipvec_t& ips);
44
45     /// Consulta a otro name server sobre un nombre
46     ResolvProtoResponse query(const std::string& name, const IPAddr& ip);
47
48     /// Loop que recibe y carga los paquetes en las colas para ser procesados
49     void recv_loop();
50
51 };
52
53 /// Impresión (para debug)
54 std::ostream& operator<< (std::ostream& os, const Resolver& res);
55 std::ostream& operator<< (std::ostream& os, const Resolver::ipvec_t& ips);
56
57 #endif // _RESOLVER_H_
58
59 // vim: set et sw=4 sts=4 :