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.

191 lines
4.1 KiB

  1. /*
  2. * Node.cpp
  3. *
  4. * Created on: 10.01.2017
  5. * Author: piotrek
  6. */
  7. #include "Node.h"
  8. Node * Node::findConnection(string ip)
  9. {
  10. if (ip == "0.0.0.0")
  11. return NULL;
  12. vector<Node*>::iterator it = this->connectedNodes.begin();
  13. for (; it != this->connectedNodes.end(); ++it)
  14. {
  15. if ((*it)->getIp() == ip)
  16. return *it;
  17. }
  18. return NULL;
  19. }
  20. /* funkcja pobiera i usuwa pakiet z bufora "karty sieciowej" */
  21. Packet Node::recv()
  22. {
  23. Packet packet;
  24. if (!this->rcvBuffer.empty())
  25. {
  26. packet = this->rcvBuffer.front();
  27. this->rcvBuffer.pop();
  28. }
  29. return packet;
  30. }
  31. Node::Node()
  32. {
  33. this->setHostname("");
  34. this->setIp("0.0.0.0");
  35. this->setMask("0.0.0.0");
  36. this->setGatewayIp("0.0.0.0");
  37. }
  38. Node::~Node()
  39. {
  40. this->connectedNodes.clear();
  41. while(!this->rcvBuffer.empty())
  42. this->rcvBuffer.pop();
  43. }
  44. Node::Node(string hostname) : Node()
  45. {
  46. this->setHostname(hostname);
  47. }
  48. Node::Node(string hostname, string ip, string mask) : Node(hostname)
  49. {
  50. this->setIp(ip);
  51. this->setMask(mask);
  52. }
  53. Node::Node(string hostname, string ip, string mask, string gatewayIp) : Node(hostname, ip, mask)
  54. {
  55. this->setGatewayIp(gatewayIp);
  56. }
  57. /*
  58. * funkcja symuluje typową sytuację: mamy kartę sieciową, a funkcja connectNode jest podłączeniem wtyczki
  59. * z jednej strony
  60. * @param firstConnected - oznacza, czy pierwsza strona jest podlaczona (jezeli nie to sprawdzamy
  61. * czy polaczenie juz gdzies zostalo przypadkowo nawiazane, nawiazujemy polaczenie, a nastepnie
  62. * przekazujemy sterowanie drugiemu wezlowi zeby zrobil to samo)
  63. */
  64. bool Node::connectNode(Node *node, bool firstConnected)
  65. {
  66. if (node->getIp() == "0.0.0.0") // jezeli wezel nie ma skonfigurowanej sieci, nie mozna go przylaczyc
  67. return false;
  68. if (!firstConnected)
  69. {
  70. vector<Node*>::iterator it = this->connectedNodes.begin();
  71. for (; it != this->connectedNodes.end(); ++it) // sprawdzamy, czy połączenia już przypadkiem nie ma
  72. {
  73. if (*it == node)
  74. return false;
  75. }
  76. }
  77. this->connectedNodes.push_back(node); // podłączamy drugi węzeł
  78. if (!firstConnected)
  79. node->connectNode(this, true); // to samo w drugą stronę
  80. return true;
  81. }
  82. /*
  83. * funkcja wysyla, czyli przekazuje kopie pakietu kolejnemu wezlowi - docelowemu lub bramie domyslnej
  84. * o ile jest skonfigurowana i istnieje do niej sciezka
  85. * TODO zaimplementowac porownywanie z maska - jezeli dstIp z maska nie gra, wysylac na ruter
  86. */
  87. bool Node::send(Packet packet, bool isRouter)
  88. {
  89. Node *node;
  90. node = this->findConnection(packet.getDstIp()); // znajdz bezposrednia trase
  91. if (!node)
  92. node = this->findConnection(this->getGatewayIp());
  93. if (!node)
  94. return false; // nie ma zadnej trasy do wezla
  95. if (packet.getDstPort() == 0)
  96. return false; // wypada zdefiniowac nadawce oraz docelowy port...
  97. // jezeli wezel nie jest routerem to ma ustawic pakietowi swoj srcIp oraz losowy port
  98. if (!isRouter)
  99. {
  100. packet.setSrcIp(this->getIp());
  101. // ustaw port zrodlowy na port losowy z zakresu [32768,61000] - zob. empheral port (port emferyczny)
  102. srand(time(NULL));
  103. packet.setSrcPort(rand() % 32768 + 28233);
  104. }
  105. node->putPacket(packet);
  106. return true;
  107. }
  108. /*
  109. * funkcja jest modelem karty sieciowej - odbiera dane z sieci i umieszcza je
  110. * w swoim buforze (czy tam systemie)
  111. */
  112. void Node::putPacket(Packet packet)
  113. {
  114. this->rcvBuffer.push(packet);
  115. }
  116. void Node::setHostname(string hostname)
  117. {
  118. this->hostname = hostname;
  119. }
  120. void Node::setIp(string ip)
  121. {
  122. this->netConf.ip = ip;
  123. }
  124. void Node::setMask(string mask)
  125. {
  126. this->netConf.mask = mask;
  127. }
  128. void Node::setGatewayIp(string gatewayIp)
  129. {
  130. this->netConf.gatewayIp = gatewayIp;
  131. }
  132. string Node::getHostname()
  133. {
  134. return this->hostname;
  135. }
  136. string Node::getIp()
  137. {
  138. return this->netConf.ip;
  139. }
  140. string Node::getMask()
  141. {
  142. return this->netConf.mask;
  143. }
  144. string Node::getGatewayIp()
  145. {
  146. return this->netConf.gatewayIp;
  147. }
  148. void Node::onRecv()
  149. {
  150. // TESTOWO
  151. Packet p = this->recv();
  152. if (p.getSrcPort() != 0)
  153. {
  154. cout << endl << "<<<<<< " << this->getHostname() << " >>>>>>" << endl;
  155. cout << "Odebrano wiadomosc!" << endl;
  156. cout << "Src: " << p.getSrcIp() << ":" << p.getSrcPort() << endl;
  157. cout << "Dst: " << p.getDstIp() << ":" << p.getDstPort() << endl;
  158. cout << "---" << endl << p.getMsg() << endl << endl;
  159. }
  160. }