]> git.llucax.com Git - z.facultad/75.74/practicos.git/blob - practicas/pipi/src/resolvproto.h
No se crea más la cola porque la crea el mismo DevQue.
[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     RP_RES_TIMEOUT     ///> Tardó demasiado la consulta
26 };
27
28 /// Petición de un nameserver
29 /// +------------+------------+------------+
30 /// | QUERY_TYPE |    SIZE    |    NAME    |
31 /// +------------+------------+------------+
32 /// /-- 1 byte --/- 2 bytes --/- variable -/
33 struct ResolvProtoRequest
34 {
35
36     /// Tipo de petición (de tipo rp_pkt_type_t)
37     uint8_t query_type;
38
39     /// Nombre a buscar
40     std::string name;
41
42     /// Constructores
43     ResolvProtoRequest(std::string name, rp_pkt_type_t query_type);
44     ResolvProtoRequest(std::string buf);
45
46     /// Envía por socket
47     void send(IPOut& ipo) const throw (std::runtime_error);
48
49     /// Recibe por socket
50     void recv(IPIn& ipi) throw (std::runtime_error);
51
52     /// Obtiene tamaño del paquete
53     size_t packet_size() const;
54
55     /// Convierte a un string
56     operator std::string () const;
57
58 };
59
60 /// Impresión de request
61 std::ostream& operator<< (std::ostream& os, const ResolvProtoRequest& rpr);
62
63
64 /// Respuesta de un nameserver
65 /// +-----------+-----------+-----------+-----------+-----------+-----------+
66 /// |    RET    |    TTL    |   COUNT   |    IP 1   |    ...    |    IP N   |
67 /// +-----------+-----------+-----------+-----------+-----------+-----------+
68 /// /-- 1 byte -/- 4 bytes -/-- 1 byte -/- 4 bytes -/- 4 bytes -/- 4 bytes -/
69 struct ResolvProtoResponse
70 {
71
72     /// Resultado de la respuesta (de tipo rp_pkt_type_t)
73     uint8_t ret;
74
75     /// TTL (sólo útil para búsquedas (inter nameserver)
76     uint32_t ttl;
77
78     /// IPs devueltas
79     typedef std::vector< IPAddr > ipvec_t;
80     ipvec_t ips;
81
82     /// Constructores
83     ResolvProtoResponse();
84     ResolvProtoResponse(rp_pkt_type_t ret, uint32_t ttl = 0,
85             const ipvec_t& ips = ipvec_t());
86     ResolvProtoResponse(std::string buf);
87
88     /// Envía por socket
89     void send(IPOut& ipo) const throw (std::runtime_error);
90
91     /// Recibe por socket
92     void recv(IPIn& ipi) throw (std::runtime_error);
93
94     /// Obtiene tamaño del paquete
95     size_t packet_size() const;
96
97     /// Convierte a un string
98     operator std::string () const;
99
100 };
101
102 /// Impresión de response
103 std::ostream& operator<< (std::ostream& os, const ResolvProtoResponse& rpr);
104
105 #endif // _RESOLVPROTO_H_
106
107 // vim: set et sw=4 sts=4 :