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

/**
* @file Node.h
*
* Created on: 10.01.2017
* @author Piotr Dergun
*/
#ifndef NODE_H_
#define NODE_H_
#include "common.h"
#include "Packet.h"
#include "Log.h"
typedef struct {
/** adres IP */
string ip;
/** maska podsieci */
string mask;
/** adres sieci */
string network;
/** adres IP bramy domyślnej */
string gatewayIp;
} NetConf;
class Node : public Log
{
private:
/** kolejka z pakietami do przetworzenia */
queue<Packet>rcvBuffer;
/** referencje do węzłów, z którymi jest podłączony */
map<Node*, bool> connectedNodes;
/** konfiguracja karty sieciowej */
NetConf netConf;
/** nazwa węzła */
string hostname;
/**
* oblicza adres sieci, do której należy węzeł
*/
void setNetwork();
protected:
/**
* zwraca wskaźnik do węzła, z którym chcemy się połączyć,
* ew. do bramy, jeżeli nic nie znajdzie, a brama jest podłączona
* @param ip adres IP węzła docelowego
*/
Node * findConnection(string ip);
/**
* pobiera i usuwa pakiet z bufora "karty sieciowej"
*/
Packet recv();
/**
* przetwarza adres IP w postaci liczbowej na postać human-readable
* @param ip adres IP (liczba)
*/
string ipToString(unsigned int ip);
/**
* przetwarza adres IP w postaci human-readable na postać liczbową
* @param ip adres IP (tekst)
*/
unsigned int stringToIp(string ip);
/**
* oblicza adres sieci dla zadanego adresu IP i maski
* @param ip adres IP
* @param mask maska podsieci
*/
string calculateNetwork(string ip, string mask);
/**
* dzieli string na części
* @param s referencja do stringu
* @param delim delimitator dzielący string na części
* @param elems referencja do wektora z podzielonymi elementami
*/
void split(const string &s, char delim, vector<string> &elems);
/**
* zwraca wektor z stringami, które powstały poprzez podzielenie stringa delimitatorem
* @s referencja do stringa, który ma zostać podzielony
* @delim delimitator
*/
vector<string> split(const string &s, char delim);
public:
Node();
Node(string hostname);
Node(string hostname, string ip, string mask);
Node(string hostname, string ip, string mask, string gatewayIp);
virtual ~Node();
/**
* "łączy" węzły, czyli umieszcza dwustronną referencję do obiektów w mapie connectedNodes.
* Jest odwzorowaniem podłączenia wtyczki w dwóch urządzeniach sieciowych.
* @param node wskaźnik do węzła zdalnego
* @param isExternal flaga, czy połączenie jest po WAN
* @param firstConnected flaga czy pierwszy węzeł został dołączony (blokuje rekurencję metody)
*/
bool connectNode(Node *node, bool isExternal = false, bool firstConnected = false);
/**
* funkcja wysyła, czyli przekazuje kopię pakietu kolejnemu węzłowi
* @param packet pakiet do wysłania
* @param isRouter flaga jeżeli true to port źródłowy i IP źródłowy mają zostać zachowane (bez zmian)
*/
int send(Packet packet, bool isRouter = false);
/**
* odbiera dane od węzła zdalnego i umieszcza je w buforze (kolejce) karty sieciowej
* @param packet pakiet
*/
void putPacket(Packet packet);
/* mutuatory */
void setHostname(string hostname);
void setIp(string ip);
void setMask(string mask);
void setGatewayIp(string gatewayIp);
string getHostname();
string getIp();
string getMask();
string getNetwork();
string getGatewayIp();
/*
* wirtualna metoda obsługi kolejki pakietów.
* Domyślnie wyłącznie ściąga pakiet z kolejki.
*/
virtual void onRecv();
};
#endif /* NODE_H_ */