From d66ae5a336271c9ff9727e9a5ef5751e60c0a22c Mon Sep 17 00:00:00 2001 From: PioDer Date: Thu, 12 Jan 2017 00:03:11 +0100 Subject: [PATCH] polaczenia do sieci jako wewnetrzne/zewnetrzne, przeniesione do mapy --- Main.cpp | 27 ++++++++++++++++++++++++++- NATRouter.cpp | 2 +- Node.cpp | 38 +++++++++++++++++++++++++------------- Node.h | 4 ++-- 4 files changed, 54 insertions(+), 17 deletions(-) diff --git a/Main.cpp b/Main.cpp index a842f37..961ad16 100644 --- a/Main.cpp +++ b/Main.cpp @@ -11,6 +11,31 @@ int main(int argc, char *argv[]) { + /* + * test puszczania sciezki external/internal + + Node k1("K1", "10.0.0.5", "255.255.255.0", "10.0.0.2"), k2("K2", "10.0.0.2", "255.255.255.0", "10.0.0.1"); + NATRouter n1("N1", "10.0.0.2", "255.255.255.0"), n2("N2", "10.0.0.1", "255.255.255.0"); + n1.setWanIp("8.8.8.8"); + n1.setWanMask("255.255.255.255"); + n2.setWanIp("8.8.4.4"); + n2.setWanMask("255.255.255.255"); + n1.connectNode(&k1); + n2.connectNode(&k2); + n2.connectNode(&n1, true); + + Packet pkt("TEST"); + pkt.setDstIp("10.0.0.2"); + pkt.setDstPort(1000); + cout << "N2 Send: " << n2.send(pkt) << endl; + cout << "Wywoluje onRecv() na N1" << endl; + n1.onRecv(); + cout << "Wywoluje onRecv() na K2" << endl; + k2.onRecv(); + + exit(0); + */ + cout << "Obiekt PC1" << endl; Node pc1("PC1", "10.0.0.2", "255.0.0.0", "10.0.0.1"); @@ -28,7 +53,7 @@ int main(int argc, char *argv[]) cout << "Obiekt S" << endl; Node s("Serwer", "8.8.8.8", "255.255.255.255"); - s.connectNode(&r1); + s.connectNode(&r1, true); /* * zastapilem to polaczenie bezposrednie diff --git a/NATRouter.cpp b/NATRouter.cpp index c9d28ae..dfa1367 100644 --- a/NATRouter.cpp +++ b/NATRouter.cpp @@ -62,7 +62,7 @@ void NATRouter::onRecv() if (p.getSrcPort() != 0) { // jezeli pakiet idzie z jednego wezla do drugiego w danej possieci to odeslij mu "jak switch" - if (this->calculateNetwork(p.getDstIp(), this->getMask()) == this->getNetwork()) + if (this->calculateNetwork(p.getDstIp(), this->getMask()) == this->getNetwork() && p.getDstIp() != this->getIp()) { this->send(p, true); } diff --git a/Node.cpp b/Node.cpp index d149a64..8728be6 100644 --- a/Node.cpp +++ b/Node.cpp @@ -10,27 +10,39 @@ Node * Node::findConnection(string ip) { - NATRouter *ptr; + NATRouter *r; + Node *ptr = NULL; if (ip == "0.0.0.0") return NULL; - vector::iterator it = this->connectedNodes.begin(); + // najpierw szukam tras lokalnych + map::iterator it = this->connectedNodes.begin(); for (; it != this->connectedNodes.end(); ++it) { - if ((*it)->getIp() == ip) - return *it; + //if ((*it)->getIp() == ip) + if ((*it).first->getIp() == ip) + { + ptr = (*it).first; + if ((*it).second == false) + return ptr; + } /* * jezeli wezel ma polaczenie do NAT-routera * (i istnieje jego interfejs WAN to sprawdz * czy nie ma z nim bezposredniego polaczenia) */ - ptr = dynamic_cast(*it); + r = dynamic_cast((*it).first); - if (ptr != NULL) - if (ptr->getWanIp() == ip) - return *it; + if (r != NULL) + if (r->getWanIp() == ip) + return (*it).first; } + /* jezeli takich nie ma, a jest zewnetrzna + * to musze wskazac do niej + */ + if (ptr) + return ptr; return NULL; } @@ -112,24 +124,24 @@ Node::Node(string hostname, string ip, string mask, string gatewayIp) : Node(hos * czy polaczenie juz gdzies zostalo przypadkowo nawiazane, nawiazujemy polaczenie, a nastepnie * przekazujemy sterowanie drugiemu wezlowi zeby zrobil to samo) */ -bool Node::connectNode(Node *node, bool firstConnected) +bool Node::connectNode(Node *node, bool isExternal, bool firstConnected) { if (node->getIp() == "0.0.0.0") // jezeli wezel nie ma skonfigurowanej sieci, nie mozna go przylaczyc return false; if (!firstConnected) { - vector::iterator it = this->connectedNodes.begin(); + map::iterator it = this->connectedNodes.begin(); for (; it != this->connectedNodes.end(); ++it) // sprawdzamy, czy połączenia już przypadkiem nie ma { - if (*it == node) + if ((*it).first == node) return false; } } - this->connectedNodes.push_back(node); // podłączamy drugi węzeł + this->connectedNodes.insert(pair(node, isExternal));//this->connectedNodes.push_back(node); // podłączamy drugi węzeł if (!firstConnected) - node->connectNode(this, true); // to samo w drugą stronę + node->connectNode(this, isExternal, true); // to samo w drugą stronę return true; } diff --git a/Node.h b/Node.h index 009b599..d0aa010 100644 --- a/Node.h +++ b/Node.h @@ -21,7 +21,7 @@ class Node { private: queuercvBuffer; // kolejka z pakietami do przetworzenia - vector connectedNodes; // referencje do węzłów, z którymi jest podłączony + map connectedNodes; // referencje do węzłów, z którymi jest podłączony NetConf netConf; // konfiguracja sieciowa string hostname; // nazwa węzła void setNetwork(); @@ -38,7 +38,7 @@ public: Node(string hostname, string ip, string mask); Node(string hostname, string ip, string mask, string gatewayIp); virtual ~Node(); - bool connectNode(Node *node, bool firstConnected = false); + bool connectNode(Node *node, bool isExternal = false, bool firstConnected = false); bool send(Packet packet, bool isRouter = false); void putPacket(Packet packet);