diff --git a/src/core/EventBus.cpp b/src/core/EventBus.cpp index 26c6c98..c8e784b 100644 --- a/src/core/EventBus.cpp +++ b/src/core/EventBus.cpp @@ -40,8 +40,8 @@ Event& EventBus::registerEvent(const string& eventID) { void EventBus::run() { while (true) { - std::this_thread::sleep_for(std::chrono::seconds(5)); - _logger.warn.ln("EventBus: Looping..."); + std::this_thread::sleep_for(std::chrono::seconds(15)); + //_logger.warn.ln("EventBus: Looping..."); } } diff --git a/src/core/main.cpp b/src/core/main.cpp index ee54c39..18e19a5 100644 --- a/src/core/main.cpp +++ b/src/core/main.cpp @@ -14,6 +14,7 @@ using std::string; void signalHandler( int ); +// Provide global hooks for signal handler Logger* globalLogger; ConfigManager* globalConfigManager; EventBus* globalEventBus; @@ -93,14 +94,18 @@ int main(int args, char **argv) { void signalHandler( int signalNumber ) { switch(signalNumber) { case SIGINT: - globalLogger->warn << "Shutting down Plains..." << Logger::commit; - globalResolver->~Server(); - globalUIServer->~Server(); - globalEventBus->~EventBus(); - globalConfigManager->~ConfigManager(); - globalLogger->info.ln ("PLAINS shut down."); - globalLogger->~Logger(); - exit(0); + static auto firstCall = true; + if(firstCall) { + firstCall = false; + globalLogger->warn << "Shutting down Plains..." << Logger::commit; + globalResolver->~Server(); + //globalUIServer->~Server(); + globalEventBus->~EventBus(); + globalConfigManager->~ConfigManager(); + globalLogger->info.ln ("PLAINS shut down."); + globalLogger->~Logger(); + exit(0); + } break; } } diff --git a/src/resolver/Server.cpp b/src/resolver/Server.cpp index 207f97e..2c79065 100644 --- a/src/resolver/Server.cpp +++ b/src/resolver/Server.cpp @@ -14,6 +14,7 @@ //Testing: #include #include +#include namespace Plains { @@ -28,12 +29,11 @@ Server::Server(Logger& logger, EventBus& eventBus) { _logger.debug.ln ("Starting Resolver..."); //throw Exception("Testi"); + + _logger.warn << "Testing some stuff..." << Logger::commit; + _logger.warn << "Message header overall size: " << sizeof(Message::Header) << Logger::commit; + //_logger.debug << "Message::QR:RESPONSE Enum:" << Message::QR::RESPONSE << endl; /* - _logger.debug << "Testing some stuff..." << Logger::commit; - _logger.debug << "Message header overall size: " << sizeof(Message::Header) << Logger::commit; - _logger.debug << "Message::Header size:" << sizeof(Message::Header) << endl; - _logger.debug << "Message::QR:RESPONSE Enum:" << Message::QR::RESPONSE << endl; - std::cerr << std::hex << 0xABCDEF std::fstream myfile; @@ -70,57 +70,71 @@ Server::Server(Logger& logger, EventBus& eventBus) _ioContext.run(); doReceive(); */ + + _stop = false; _thread = thread(&Server::run, this); _logger.debug.ln ("Resolver started"); } Server::~Server() { _logger.debug.ln ("Stopping Resolver..."); + _stop = true; //_udpSocket->close(); - _thread.join(); + _thread.join(); _logger.debug.ln ("Resolver stopped"); } void Server::run() { -// _ioContext.run(); -// doReceive(); + //_ioContext.run(); + //doReceive(); _logger.warn.ln ("Hi From resolver thread!"); char msg[] = "Hello to you too!!!\n"; - //creating a new server socket - if ((_serSockDes = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { - perror("socket creation error...\n"); - exit(-1); - } + int udpServerSocket, udpReadStatus; + struct sockaddr_in serverAddress, clientAddress; + socklen_t clientAddressLength; //binding the port to ip and port - _serAddr.sin_family = AF_INET; - _serAddr.sin_port = htons(PORT); - _serAddr.sin_addr.s_addr = INADDR_ANY; + serverAddress.sin_family = AF_INET; + serverAddress.sin_port = htons(PORT); + serverAddress.sin_addr.s_addr = INADDR_ANY; + clientAddressLength = sizeof(clientAddress); - if ((bind(_serSockDes, (struct sockaddr*)&_serAddr, sizeof(_serAddr))) < 0) { - perror("binding error...\n"); - close(_serSockDes); - exit(-1); + // Create receive buffer + char buffer[65508] = { 0 }; // (2**16 = 65,536 − 8 byte UDP header − 20 byte IP header) + + // Create new UDP Socket + if ((udpServerSocket = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + _logger.fatal.ln("socket creation error..."); } - _cliAddrLen = sizeof(_cliAddr); - _readStatus = recvfrom(_serSockDes, _buff, 1024, 0, (struct sockaddr*)&_cliAddr, &_cliAddrLen); - if (_readStatus < 0) { - perror("reading error...\n"); - close(_serSockDes); - exit(-1); + // Bind UDP Socket + if ((bind(udpServerSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress))) < 0) { + _logger.fatal.ln("binding error..."); } - std::cout.write(_buff, _readStatus); + while(!_stop) { + udpReadStatus = recvfrom(udpServerSocket, buffer, sizeof(buffer), 0, (struct sockaddr*)&clientAddress, &clientAddressLength); - if ( sendto(_serSockDes, msg, strlen(msg), 0, (struct sockaddr*)&_cliAddr, _cliAddrLen) < 0 ) { - _logger.debug.ln("sending error...\n"); - close(_serSockDes); - exit(-1); + if (udpServerSocket < 0) { + close(udpServerSocket); + _logger.warn.ln("reading error..."); + } + + //std::cout.write(buffer, udpReadStatus); + //std::cout << "size: " << udpReadStatus << std::endl; + for(int i=0; i(buffer[i]); + } + + if ( sendto(udpServerSocket, msg, strlen(msg), 0, (struct sockaddr*)&clientAddress, clientAddressLength) < 0 ) { + close(udpServerSocket); + _logger.warn.ln("sending error..."); + } } - close(_serSockDes); + close(udpServerSocket); } /* diff --git a/src/resolver/include/Server.hpp b/src/resolver/include/Server.hpp index 9eecec7..e0cc7c6 100644 --- a/src/resolver/include/Server.hpp +++ b/src/resolver/include/Server.hpp @@ -31,11 +31,8 @@ class Server //asio::ip::udp::socket* _udpSocket; //asio::ip::udp::endpoint _sender_endpoint; //char _data[1024]; - char _buff[1024] = {0}; - int _serSockDes, _readStatus; - struct sockaddr_in _serAddr, _cliAddr; - socklen_t _cliAddrLen; thread _thread; + bool _stop; private: //void doReceive();