]> git.llucax.com Git - z.facultad/75.74/practicos.git/blobdiff - practicas/pipi/src/nameserver.h
Queda lo mínimo del DNS implementado. Una prueba simple en una red sin routers
[z.facultad/75.74/practicos.git] / practicas / pipi / src / nameserver.h
index 24b8e86bf1deb291570de42d1b21344400a02add..d9b8a4f3419faa76129c89e6462c2b2b9fe5c581 100644 (file)
@@ -1,6 +1,7 @@
 #ifndef _NAMESERVER_H_
 #define _NAMESERVER_H_
 
+#include "devque.h"
 #include "ipaddr.h"
 #include "resolvproto.h"
 #include <string>
@@ -10,6 +11,8 @@
 #include <ostream>
 #include <stdexcept>
 
+#define NAMESERVER_PROTO 59
+
 /// Petición del resolver a un nameserver
 struct NameServer
 {
@@ -20,7 +23,7 @@ struct NameServer
         /// Constructor
         Name() {}
         Name(const std::string& name);
-        operator std::string ();
+        operator std::string () const;
     };
 
     /// Registro de una zona
@@ -77,11 +80,41 @@ struct NameServer
     typedef std::map< Name, CacheRecord > cache_t;
     cache_t cache;
 
+    /// IP
+    IPIn& ipin;
+    IPOut& ipout;
+
+    /// Colas de recepción
+    DevQue& req_que; // De requests
+    DevQue& res_que; // De responses
+
+    /// Cola de envío
+    DevQue& snd_que;
+
     /// Constructor
-    NameServer(std::istream& is) throw (std::runtime_error);
+    NameServer(std::istream& is, IPIn& ipin, IPOut& ipout, DevQue& req_que,
+            DevQue& res_que, DevQue& snd_que) throw (std::runtime_error);
+
+    /// Resuelve un nombre de forma directa (no recursiva)
+    ResolvProtoResponse resolv_direct(const Name& n);
+
+    /// Resuelve un nombre de forma recursiva
+    ResolvProtoResponse resolv_recursive(const Name& n);
+
+    /// Consulta a otro name server sobre un nombre
+    ResolvProtoResponse query(const Name&n, const IPAddr& ip);
+
+    /// Loop que recibe y carga los paquetes en las colas para ser procesados
+    void recv_loop();
+
+    /// Loop que envía los paquetes de la cola de envío
+    void send_loop();
+
+    private:
+    /// Resuelve un nombre de forma recursiva entrando a otros ns
+    ResolvProtoResponse resolv_recursive_r(const Name& n,
+            ResolvProtoResponse rpr);
 
-    /// Resuelve un nombre de forma no recursiva
-    ResolvProtoResponse resolv_next(const Name& n);
 };
 
 /// Impresión (para debug)