X-Git-Url: https://git.llucax.com/z.facultad/75.74/practicos.git/blobdiff_plain/46098de47811c686844e5cb8b1d8f1b59586e6b8..HEAD:/practicas/pipi/src/resolvproto.h diff --git a/practicas/pipi/src/resolvproto.h b/practicas/pipi/src/resolvproto.h index 7caf4f8..b554bcc 100644 --- a/practicas/pipi/src/resolvproto.h +++ b/practicas/pipi/src/resolvproto.h @@ -2,11 +2,28 @@ #define _RESOLVPROTO_H_ #include "ipaddr.h" +#include "ipin.h" +#include "ipout.h" #include #include #include #include +/// 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ó +}; + /// Petición de un nameserver /// +------------+------------+------------+ /// | QUERY_TYPE | SIZE | NAME | @@ -15,28 +32,27 @@ 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; - /// Constructor - ResolvProtoRequest(int fd); - - /// Constructor - ResolvProtoRequest(std::string name, uint8_t query_type = QT_RECURSIVE); + /// Constructores + 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; }; @@ -52,14 +68,7 @@ std::ostream& operator<< (std::ostream& os, const ResolvProtoRequest& rpr); 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) @@ -69,17 +78,23 @@ struct ResolvProtoResponse typedef std::vector< IPAddr > ipvec_t; ipvec_t ips; - /// Constructor - ResolvProtoResponse(int fd); - - /// Constructor - ResolvProtoResponse(ret_t ret, uint32_t ttl); + /// Constructores + ResolvProtoResponse(); + 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; };