#define _RESOLVPROTO_H_
#include "ipaddr.h"
+#include "ipin.h"
+#include "ipout.h"
#include <string>
#include <vector>
#include <stdexcept>
#include <stdint.h>
+/// Número de protocolo del resolver
+#define RESOLV_PROTO 59
+
+/// Tipo de petición
+enum rp_pkt_type_t
+{
+ // requests
+ RP_REQ_DIRECT, ///> Búsqueda directa (inter nameservers)
+ RP_REQ_RECURSIVE, ///> Búsqueda recursiva (para resolvers)
+ // responses
+ RP_RES_A, ///> OK, se devolvió un registro A
+ RP_RES_NS, ///> OK, se devolvió un registro NS (sólo en directo)
+ RP_RES_NOTFOUND, ///> No se encontró
+ RP_RES_TIMEOUT ///> Tardó demasiado la consulta
+};
+
/// Petición de un nameserver
/// +------------+------------+------------+
/// | QUERY_TYPE | SIZE | NAME |
struct ResolvProtoRequest
{
- /// Tipo de petición
- enum query_type_t
- {
- QT_DIRECT, ///> Búsqueda directa (inter nameservers)
- QT_RECURSIVE ///> Búsqueda recursiva (para resolvers)
- };
+ /// Tipo de petición (de tipo rp_pkt_type_t)
uint8_t query_type;
/// Nombre a buscar
std::string name;
/// Constructores
- ResolvProtoRequest(int fd);
- ResolvProtoRequest(std::string name, uint8_t query_type = QT_RECURSIVE);
+ ResolvProtoRequest(std::string name, rp_pkt_type_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;
};
struct ResolvProtoResponse
{
- /// 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
- };
+ /// Resultado de la respuesta (de tipo rp_pkt_type_t)
uint8_t ret;
/// TTL (sólo útil para búsquedas (inter nameserver)
/// Constructores
ResolvProtoResponse();
- ResolvProtoResponse(int fd);
- ResolvProtoResponse(ret_t ret, uint32_t ttl = 0,
+ ResolvProtoResponse(rp_pkt_type_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;
};