Symulacja NAT na przedmiot Symulacje Komputerowe
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

126 lines
3.4 KiB

  1. /**
  2. * @file Node.h
  3. *
  4. * Created on: 10.01.2017
  5. * @author Piotr Dergun
  6. */
  7. #ifndef NODE_H_
  8. #define NODE_H_
  9. #include "common.h"
  10. #include "Packet.h"
  11. #include "Log.h"
  12. typedef struct {
  13. /** adres IP */
  14. string ip;
  15. /** maska podsieci */
  16. string mask;
  17. /** adres sieci */
  18. string network;
  19. /** adres IP bramy domyślnej */
  20. string gatewayIp;
  21. } NetConf;
  22. class Node : public Log
  23. {
  24. private:
  25. /** kolejka z pakietami do przetworzenia */
  26. queue<Packet>rcvBuffer;
  27. /** referencje do węzłów, z którymi jest podłączony */
  28. map<Node*, bool> connectedNodes;
  29. /** konfiguracja karty sieciowej */
  30. NetConf netConf;
  31. /** nazwa węzła */
  32. string hostname;
  33. /**
  34. * oblicza adres sieci, do której należy węzeł
  35. */
  36. void setNetwork();
  37. protected:
  38. /**
  39. * zwraca wskaźnik do węzła, z którym chcemy się połączyć,
  40. * ew. do bramy, jeżeli nic nie znajdzie, a brama jest podłączona
  41. * @param ip adres IP węzła docelowego
  42. */
  43. Node * findConnection(string ip);
  44. /**
  45. * pobiera i usuwa pakiet z bufora "karty sieciowej"
  46. */
  47. Packet recv();
  48. /**
  49. * przetwarza adres IP w postaci liczbowej na postać human-readable
  50. * @param ip adres IP (liczba)
  51. */
  52. string ipToString(unsigned int ip);
  53. /**
  54. * przetwarza adres IP w postaci human-readable na postać liczbową
  55. * @param ip adres IP (tekst)
  56. */
  57. unsigned int stringToIp(string ip);
  58. /**
  59. * oblicza adres sieci dla zadanego adresu IP i maski
  60. * @param ip adres IP
  61. * @param mask maska podsieci
  62. */
  63. string calculateNetwork(string ip, string mask);
  64. /**
  65. * dzieli string na części
  66. * @param s referencja do stringu
  67. * @param delim delimitator dzielący string na części
  68. * @param elems referencja do wektora z podzielonymi elementami
  69. */
  70. void split(const string &s, char delim, vector<string> &elems);
  71. /**
  72. * zwraca wektor z stringami, które powstały poprzez podzielenie stringa delimitatorem
  73. * @s referencja do stringa, który ma zostać podzielony
  74. * @delim delimitator
  75. */
  76. vector<string> split(const string &s, char delim);
  77. public:
  78. Node();
  79. Node(string hostname);
  80. Node(string hostname, string ip, string mask);
  81. Node(string hostname, string ip, string mask, string gatewayIp);
  82. virtual ~Node();
  83. /**
  84. * "łączy" węzły, czyli umieszcza dwustronną referencję do obiektów w mapie connectedNodes.
  85. * Jest odwzorowaniem podłączenia wtyczki w dwóch urządzeniach sieciowych.
  86. * @param node wskaźnik do węzła zdalnego
  87. * @param isExternal flaga, czy połączenie jest po WAN
  88. * @param firstConnected flaga czy pierwszy węzeł został dołączony (blokuje rekurencję metody)
  89. */
  90. bool connectNode(Node *node, bool isExternal = false, bool firstConnected = false);
  91. /**
  92. * funkcja wysyła, czyli przekazuje kopię pakietu kolejnemu węzłowi
  93. * @param packet pakiet do wysłania
  94. * @param isRouter flaga jeżeli true to port źródłowy i IP źródłowy mają zostać zachowane (bez zmian)
  95. */
  96. int send(Packet packet, bool isRouter = false);
  97. /**
  98. * odbiera dane od węzła zdalnego i umieszcza je w buforze (kolejce) karty sieciowej
  99. * @param packet pakiet
  100. */
  101. void putPacket(Packet packet);
  102. /* mutuatory */
  103. void setHostname(string hostname);
  104. void setIp(string ip);
  105. void setMask(string mask);
  106. void setGatewayIp(string gatewayIp);
  107. string getHostname();
  108. string getIp();
  109. string getMask();
  110. string getNetwork();
  111. string getGatewayIp();
  112. /*
  113. * wirtualna metoda obsługi kolejki pakietów.
  114. * Domyślnie wyłącznie ściąga pakiet z kolejki.
  115. */
  116. virtual void onRecv();
  117. };
  118. #endif /* NODE_H_ */