#define _RESOLVPROTO_H_
#include "ipaddr.h"
+#include "ipin.h"
+#include "ipout.h"
#include <string>
#include <vector>
#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
- ResolvProtoRequest(int fd);
-
- /// Constructor
- ResolvProtoRequest(std::string name, uint8_t type = TYPE_QUERY);
+ /// Constructores
+ ResolvProtoRequest(std::string name, uint8_t query_type);
+ ResolvProtoRequest(std::string buf);
/// Envía por socket
- void send(int sockfd) const throw (std::runtime_error);
+ void send(IPOut& ipo) const throw (std::runtime_error);
/// Recibe por socket
- void recv(int sockfd) throw (std::runtime_error);
+ void recv(IPIn& ipi) throw (std::runtime_error);
+
+ /// Obtiene tamaño del paquete
+ size_t packet_size() const;
+
+ /// Convierte a un string
+ operator std::string () const;
};
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
- ResolvProtoResponse(int fd);
-
- /// Constructor
- ResolvProtoResponse(ret_t ret);
+ /// Constructores
+ ResolvProtoResponse();
+ ResolvProtoResponse(ret_t ret, uint32_t ttl = 0,
+ const ipvec_t& ips = ipvec_t());
+ ResolvProtoResponse(std::string buf);
/// Envía por socket
- void send(int sockfd) const throw (std::runtime_error);
+ void send(IPOut& ipo) const throw (std::runtime_error);
/// Recibe por socket
- void recv(int sockfd) throw (std::runtime_error);
+ void recv(IPIn& ipi) throw (std::runtime_error);
+
+ /// Obtiene tamaño del paquete
+ size_t packet_size() const;
+
+ /// Convierte a un string
+ operator std::string () const;
};