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