X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/blobdiff_plain/037c7a6a269f053f09e3ebab3c28e4453b576d18..c26a92b22080c9c6cbec81ad6b49f2899864e5aa:/practicas/pipi/src/resolvproto.h diff --git a/practicas/pipi/src/resolvproto.h b/practicas/pipi/src/resolvproto.h index 826fa38..50ec171 100644 --- a/practicas/pipi/src/resolvproto.h +++ b/practicas/pipi/src/resolvproto.h @@ -2,35 +2,47 @@ #define _RESOLVPROTO_H_ #include "ipaddr.h" +#include "ipin.h" +#include "ipout.h" #include #include #include #include -/// 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; }; @@ -38,31 +50,48 @@ struct ResolvProtoRequest 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; };