]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/resolvproto.h
Se emprolija un poco la info de debug.
[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 "ipin.h"
6 #include "ipout.h"
7 #include <string>
8 #include <vector>
9 #include <stdexcept>
10 #include <stdint.h>
11
12 /// Número de protocolo del resolver
13 #define RESOLV_PROTO 59
14
15 /// Tipo de petición
16 enum rp_pkt_type_t
17 {
18     // requests
19     RP_REQ_DIRECT,     ///> Búsqueda directa (inter nameservers)
20     RP_REQ_RECURSIVE,  ///> Búsqueda recursiva (para resolvers)
21     // responses
22     RP_RES_A,          ///> OK, se devolvió un registro A
23     RP_RES_NS,         ///> OK, se devolvió un registro NS (sólo en directo)
24     RP_RES_NOTFOUND    ///> No se encontró
25 };
26
27 /// Petición de un nameserver
28 /// +------------+------------+------------+
29 /// | QUERY_TYPE |    SIZE    |    NAME    |
30 /// +------------+------------+------------+
31 /// /-- 1 byte --/- 2 bytes --/- variable -/
32 struct ResolvProtoRequest
33 {
34
35     /// Tipo de petición (de tipo rp_pkt_type_t)
36     uint8_t query_type;
37
38     /// Nombre a buscar
39     std::string name;
40
41     /// Constructores
42     ResolvProtoRequest(std::string name, rp_pkt_type_t query_type);
43     ResolvProtoRequest(std::string buf);
44
45     /// Envía por socket
46     void send(IPOut& ipo) const throw (std::runtime_error);
47
48     /// Recibe por socket
49     void recv(IPIn& ipi) throw (std::runtime_error);
50
51     /// Obtiene tamaño del paquete
52     size_t packet_size() const;
53
54     /// Convierte a un string
55     operator std::string () const;
56
57 };
58
59 /// Impresión de request
60 std::ostream& operator<< (std::ostream& os, const ResolvProtoRequest& rpr);
61
62
63 /// Respuesta de un nameserver
64 /// +-----------+-----------+-----------+-----------+-----------+-----------+
65 /// |    RET    |    TTL    |   COUNT   |    IP 1   |    ...    |    IP N   |
66 /// +-----------+-----------+-----------+-----------+-----------+-----------+
67 /// /-- 1 byte -/- 4 bytes -/-- 1 byte -/- 4 bytes -/- 4 bytes -/- 4 bytes -/
68 struct ResolvProtoResponse
69 {
70
71     /// Resultado de la respuesta (de tipo rp_pkt_type_t)
72     uint8_t ret;
73
74     /// TTL (sólo útil para búsquedas (inter nameserver)
75     uint32_t ttl;
76
77     /// IPs devueltas
78     typedef std::vector< IPAddr > ipvec_t;
79     ipvec_t ips;
80
81     /// Constructores
82     ResolvProtoResponse();
83     ResolvProtoResponse(rp_pkt_type_t ret, uint32_t ttl = 0,
84             const ipvec_t& ips = ipvec_t());
85     ResolvProtoResponse(std::string buf);
86
87     /// Envía por socket
88     void send(IPOut& ipo) const throw (std::runtime_error);
89
90     /// Recibe por socket
91     void recv(IPIn& ipi) throw (std::runtime_error);
92
93     /// Obtiene tamaño del paquete
94     size_t packet_size() const;
95
96     /// Convierte a un string
97     operator std::string () const;
98
99 };
100
101 /// Impresión de response
102 std::ostream& operator<< (std::ostream& os, const ResolvProtoResponse& rpr);
103
104 #endif // _RESOLVPROTO_H_
105
106 // vim: set et sw=4 sts=4 :