]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/resolvproto.h
Se hace más genérico el protocolo del resolver (para que pueda ser usado para
[z.facultad/75.74/practicos.git] / practicas / pipi / src / resolvproto.h
1 #ifndef _RESOLVPROTO_H_
2 #define _RESOLVPROTO_H_
3
4 #include "ipaddr.h"
5 #include <string>
6 #include <vector>
7 #include <stdexcept>
8 #include <stdint.h>
9
10 /// Petición de un nameserver
11 /// +------------+------------+------------+
12 /// | QUERY_TYPE |    SIZE    |    NAME    |
13 /// +------------+------------+------------+
14 /// /-- 1 byte --/- 2 bytes --/- variable -/
15 struct ResolvProtoRequest
16 {
17
18     /// Tipo de petición
19     enum query_type_t
20     {
21         QT_DIRECT,      ///> Búsqueda directa (inter nameservers)
22         QT_RECURSIVE    ///> Búsqueda recursiva (para resolvers)
23     };
24     uint8_t query_type;
25
26     /// Nombre a buscar
27     std::string name;
28
29     /// Constructor
30     ResolvProtoRequest(int fd);
31
32     /// Constructor
33     ResolvProtoRequest(std::string name, uint8_t query_type = QT_RECURSIVE);
34
35     /// Envía por socket
36     void send(int sockfd) const throw (std::runtime_error);
37
38     /// Recibe por socket
39     void recv(int sockfd) throw (std::runtime_error);
40
41 };
42
43 /// Impresión de request
44 std::ostream& operator<< (std::ostream& os, const ResolvProtoRequest& rpr);
45
46
47 /// Respuesta de un nameserver
48 /// +-----------+-----------+-----------+-----------+-----------+-----------+
49 /// |    RET    |    TTL    |   COUNT   |    IP 1   |    ...    |    IP N   |
50 /// +-----------+-----------+-----------+-----------+-----------+-----------+
51 /// /-- 1 byte -/- 4 bytes -/-- 1 byte -/- 4 bytes -/- 4 bytes -/- 4 bytes -/
52 struct ResolvProtoResponse
53 {
54
55     /// Resultado de la respuesta
56     enum ret_t
57     {
58         R_A,            ///> OK, se devolvió un registro A
59         R_NS,           ///> OK, se devolvió un registro NS (sólo en directo)
60         R_NOTFOUND,     ///> No se encontró
61         R_TIMEOUT       ///> Tardó demasiado la consulta
62     };
63     uint8_t ret;
64
65     /// TTL (sólo útil para búsquedas (inter nameserver)
66     uint32_t ttl;
67
68     /// IPs devueltas
69     typedef std::vector< IPAddr > ipvec_t;
70     ipvec_t ips;
71
72     /// Constructor
73     ResolvProtoResponse(int fd);
74
75     /// Constructor
76     ResolvProtoResponse(ret_t ret, uint32_t ttl);
77
78     /// Envía por socket
79     void send(int sockfd) const throw (std::runtime_error);
80
81     /// Recibe por socket
82     void recv(int sockfd) throw (std::runtime_error);
83
84 };
85
86 /// Impresión de response
87 std::ostream& operator<< (std::ostream& os, const ResolvProtoResponse& rpr);
88
89 #endif // _RESOLVPROTO_H_
90
91 // vim: set et sw=4 sts=4 :