Browse Source

polaczenia do sieci jako wewnetrzne/zewnetrzne, przeniesione do mapy

master
Piotr Dergun 7 years ago
parent
commit
d66ae5a336
4 changed files with 54 additions and 17 deletions
  1. +26
    -1
      Main.cpp
  2. +1
    -1
      NATRouter.cpp
  3. +25
    -13
      Node.cpp
  4. +2
    -2
      Node.h

+ 26
- 1
Main.cpp View File

@ -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

+ 1
- 1
NATRouter.cpp View File

@ -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);
}

+ 25
- 13
Node.cpp View File

@ -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<Node*>::iterator it = this->connectedNodes.begin();
// najpierw szukam tras lokalnych
map<Node*, bool>::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<NATRouter*>(*it);
r = dynamic_cast<NATRouter*>((*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<Node*>::iterator it = this->connectedNodes.begin();
map<Node*, bool>::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*, bool>(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;
}

+ 2
- 2
Node.h View File

@ -21,7 +21,7 @@ class Node
{
private:
queue<Packet>rcvBuffer; // kolejka z pakietami do przetworzenia
vector<Node*> connectedNodes; // referencje do węzłów, z którymi jest podłączony
map<Node*, bool> 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);

Loading…
Cancel
Save