/**
|
|
* @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_ */
|