]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/resolvproto.h
Se utiliza el ResolvProtoResponse para devolver el resultado de una búsqueda no
[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     /// Constructores
30     ResolvProtoRequest(int fd);
31     ResolvProtoRequest(std::string name, uint8_t query_type = QT_RECURSIVE);
32
33     /// Envía por socket
34     void send(int sockfd) const throw (std::runtime_error);
35
36     /// Recibe por socket
37     void recv(int sockfd) throw (std::runtime_error);
38
39 };
40
41 /// Impresión de request
42 std::ostream& operator<< (std::ostream& os, const ResolvProtoRequest& rpr);
43
44
45 /// Respuesta de un nameserver
46 /// +-----------+-----------+-----------+-----------+-----------+-----------+
47 /// |    RET    |    TTL    |   COUNT   |    IP 1   |    ...    |    IP N   |
48 /// +-----------+-----------+-----------+-----------+-----------+-----------+
49 /// /-- 1 byte -/- 4 bytes -/-- 1 byte -/- 4 bytes -/- 4 bytes -/- 4 bytes -/
50 struct ResolvProtoResponse
51 {
52
53     /// Resultado de la respuesta
54     enum ret_t
55     {
56         R_A,            ///> OK, se devolvió un registro A
57         R_NS,           ///> OK, se devolvió un registro NS (sólo en directo)
58         R_NOTFOUND,     ///> No se encontró
59         R_TIMEOUT       ///> Tardó demasiado la consulta
60     };
61     uint8_t ret;
62
63     /// TTL (sólo útil para búsquedas (inter nameserver)
64     uint32_t ttl;
65
66     /// IPs devueltas
67     typedef std::vector< IPAddr > ipvec_t;
68     ipvec_t ips;
69
70     /// Constructores
71     ResolvProtoResponse();
72     ResolvProtoResponse(int fd);
73     ResolvProtoResponse(ret_t ret, uint32_t ttl = 0,
74             const ipvec_t& ips = ipvec_t());
75
76     /// Envía por socket
77     void send(int sockfd) const throw (std::runtime_error);
78
79     /// Recibe por socket
80     void recv(int sockfd) throw (std::runtime_error);
81
82 };
83
84 /// Impresión de response
85 std::ostream& operator<< (std::ostream& os, const ResolvProtoResponse& rpr);
86
87 #endif // _RESOLVPROTO_H_
88
89 // vim: set et sw=4 sts=4 :