#include <stdexcept>
#include <stdint.h>
-/// Petición del resolver a un nameserver
+/// Petición de un nameserver
+/// +------------+------------+------------+
+/// | QUERY_TYPE | SIZE | NAME |
+/// +------------+------------+------------+
+/// /-- 1 byte --/- 2 bytes --/- variable -/
struct ResolvProtoRequest
{
- /// Tipo de petición, por ahora sólo QUERY
- enum { TYPE_QUERY };
-
- /// Tipo de petición, por ahora sólo QUERY
- uint8_t type;
+ /// Tipo de petición
+ enum query_type_t
+ {
+ QT_DIRECT, ///> Búsqueda directa (inter nameservers)
+ QT_RECURSIVE ///> Búsqueda recursiva (para resolvers)
+ };
+ uint8_t query_type;
/// Nombre a buscar
std::string name;
- /// Constructor
+ /// Constructores
ResolvProtoRequest(int fd);
-
- /// Constructor
- ResolvProtoRequest(std::string name, uint8_t type = TYPE_QUERY);
+ ResolvProtoRequest(std::string name, uint8_t query_type = QT_RECURSIVE);
/// Envía por socket
void send(int sockfd) const throw (std::runtime_error);
std::ostream& operator<< (std::ostream& os, const ResolvProtoRequest& rpr);
-/// Respuesta del resolver a un nameserver
+/// Respuesta de un nameserver
+/// +-----------+-----------+-----------+-----------+-----------+-----------+
+/// | RET | TTL | COUNT | IP 1 | ... | IP N |
+/// +-----------+-----------+-----------+-----------+-----------+-----------+
+/// /-- 1 byte -/- 4 bytes -/-- 1 byte -/- 4 bytes -/- 4 bytes -/- 4 bytes -/
struct ResolvProtoResponse
{
/// Resultado de la respuesta
- enum ret_t { RET_OK, RET_NOTFOUND, RET_TIMEOUT };
-
- /// Resultado de la respuesta
+ enum ret_t
+ {
+ R_A, ///> OK, se devolvió un registro A
+ R_NS, ///> OK, se devolvió un registro NS (sólo en directo)
+ R_NOTFOUND, ///> No se encontró
+ R_TIMEOUT ///> Tardó demasiado la consulta
+ };
uint8_t ret;
+ /// TTL (sólo útil para búsquedas (inter nameserver)
+ uint32_t ttl;
+
/// IPs devueltas
typedef std::vector< IPAddr > ipvec_t;
ipvec_t ips;
- /// Constructor
+ /// Constructores
+ ResolvProtoResponse();
ResolvProtoResponse(int fd);
-
- /// Constructor
- ResolvProtoResponse(ret_t ret);
+ ResolvProtoResponse(ret_t ret, uint32_t ttl = 0,
+ const ipvec_t& ips = ipvec_t());
/// Envía por socket
void send(int sockfd) const throw (std::runtime_error);