]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/resolvproto.h
Se emprolija un poco la info de debug.
[z.facultad/75.74/practicos.git] / practicas / pipi / src / resolvproto.h
index ab41bf9408b71a2ef46db9deaae9d0d935b176de..b554bcc614e6850bd6344005d147b3cc95a5a82e 100644 (file)
@@ -2,11 +2,28 @@
 #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ó
+};
+
 /// 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;
 
 };
 
@@ -50,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,15 +80,21 @@ struct ResolvProtoResponse
 
     /// 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;
 
 };