/** * @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 */ queuercvBuffer; /** referencje do węzłów, z którymi jest podłączony */ map 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 &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 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_ */