]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/resolvproto.h
Se agrega opción para recibir paquetes de un host específico y se mejora el
[z.facultad/75.74/practicos.git] / practicas / pipi / src / resolvproto.h
index 826fa386a0b0353e25ddac455e517cfe16618dac..ab41bf9408b71a2ef46db9deaae9d0d935b176de 100644 (file)
@@ -7,24 +7,28 @@
 #include <stdexcept>
 #include <stdint.h>
 
 #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
 {
 
 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;
 
 
     /// Nombre a buscar
     std::string name;
 
-    /// Constructor
+    /// Constructores
     ResolvProtoRequest(int fd);
     ResolvProtoRequest(int fd);
-
-    /// Constructor
-    ResolvProtoRequest(std::string name, uint8_t type = TYPE_QUERY);
+    ResolvProtoRequest(std::string name, uint8_t query_type = QT_RECURSIVE);
 
     /// Envía por socket
     void send(int sockfd) const throw (std::runtime_error);
 
     /// Envía por socket
     void send(int sockfd) const throw (std::runtime_error);
@@ -38,25 +42,36 @@ struct ResolvProtoRequest
 std::ostream& operator<< (std::ostream& os, const ResolvProtoRequest& rpr);
 
 
 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
 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;
 
     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;
 
     /// IPs devueltas
     typedef std::vector< IPAddr > ipvec_t;
     ipvec_t ips;
 
-    /// Constructor
+    /// Constructores
+    ResolvProtoResponse();
     ResolvProtoResponse(int fd);
     ResolvProtoResponse(int fd);
-
-    /// Constructor
-    ResolvProtoResponse(ret_t ret);
+    ResolvProtoResponse(ret_t ret, uint32_t ttl = 0,
+            const ipvec_t& ips = ipvec_t());
 
     /// Envía por socket
     void send(int sockfd) const throw (std::runtime_error);
 
     /// Envía por socket
     void send(int sockfd) const throw (std::runtime_error);