modified: src/core/EventBus.cpp modified: src/core/Logger.cpp modified: src/core/include/ConfigManager.hpp modified: src/core/include/EventBus.hpp modified: src/core/include/Logger.hpp modified: src/core/main.cpp modified: src/resolver/Server.cpp modified: src/resolver/include/Server.hpp modified: src/ui/CMakeLists.txt modified: src/ui/Server.cpp new file: src/ui/files/index.htm.h new file: src/ui/files/style.css.h modified: src/ui/include/Server.hpp deleted: static/ui/index.htm deleted: static/ui/style.css 1. Convert static files of ui module to be included inside source code. 2. Convert logger class to singleton. 3. Remove all globals. kind breaks main function. Needs to be cleaned. currently shutdown is not cleanly handled.
191 lines
6.0 KiB
C++
191 lines
6.0 KiB
C++
#include "Server.hpp"
|
||
#include "Message.hpp"
|
||
|
||
#include <memory>
|
||
#include <utility>
|
||
#include <vector>
|
||
#include <ctime>
|
||
|
||
#include <sys/socket.h>
|
||
#include <netinet/in.h>
|
||
#include <arpa/inet.h>
|
||
#include <unistd.h>
|
||
|
||
//Testing:
|
||
#include <fstream>
|
||
#include <iomanip>
|
||
|
||
|
||
namespace Plains {
|
||
namespace Resolver {
|
||
|
||
//using asio::ip::udp;
|
||
//using asio::ip::tcp;
|
||
|
||
Server::Server(EventBus& eventBus)
|
||
: _logger(Logger::getInstance()),
|
||
_eventBus(eventBus)
|
||
{
|
||
_logger.debug.ln ("Starting Resolver...");
|
||
|
||
_logger.warn << "Testing some stuff..." << Logger::commit;
|
||
//_logger.warn << "Message class overall size: " << sizeof(Message) << Logger::commit;
|
||
//_logger.debug << "Message::QR:RESPONSE Enum:" << Message::QR::RESPONSE << endl;
|
||
/*
|
||
|
||
std::fstream myfile;
|
||
std::streampos beg,end;
|
||
myfile.open ("/tmp/packet.bin", std::ios::in | std::ios::binary);
|
||
myfile.seekg (0, std::ios::end);
|
||
end = myfile.tellg();
|
||
myfile.seekg (0, std::ios::beg);
|
||
beg = myfile.tellg();
|
||
const unsigned long size = end-beg;
|
||
Message* message = new Message;
|
||
myfile.read ((char*)header, sizeof(Message));
|
||
_logger.debug << "size is: " << size << " bytes." << Logger::commit;
|
||
|
||
_logger.debug << "Header: " << Logger::commit;
|
||
//_logger.debug << "ID: " << 0x1ef8 <<
|
||
_logger.debug << "ID: " << intToHex(2, header->id) <<
|
||
" QR: " << byteToHex(header->qr) <<
|
||
" OPCode: " << byteToHex(header->opCode) << Logger::commit <<
|
||
"Authoritive Answer: " << byteToHex(header->aa) << Logger::commit <<
|
||
"Truncation Flag: " << byteToHex(header->tc) << Logger::commit <<
|
||
"Recursion Desired: " << byteToHex(header->rd) << Logger::commit <<
|
||
"Recursion Available: " << byteToHex(header->ra) << Logger::commit <<
|
||
"RCode: " << byteToHex(header->rCode) << Logger::commit <<
|
||
"Question Count: " << intToHex(2, header->qdCount) << Logger::commit <<
|
||
"Answer Record Count: " << intToHex(2, header->anCount) << Logger::commit <<
|
||
"Authority Record Count: " << intToHex(2, header->nsCount) << Logger::commit <<
|
||
"Additional Record Count: " << intToHex(2, header->arCount) << Logger::commit;
|
||
myfile.close();
|
||
//Testing over
|
||
_logger.debug << "Done testing" << Logger::commit;
|
||
|
||
_udpSocket = new udp::socket(_ioContext, udp::endpoint(udp::v4(), 8853));
|
||
_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();
|
||
_logger.debug.ln ("Resolver stopped");
|
||
}
|
||
|
||
void Server::run() {
|
||
//_ioContext.run();
|
||
//doReceive();
|
||
_logger.warn.ln ("Hi From resolver thread!");
|
||
char msg[] = "Hello to you too!!!\n";
|
||
|
||
int udpServerSocket, udpReadStatus;
|
||
struct sockaddr_in serverAddress, clientAddress;
|
||
socklen_t clientAddressLength;
|
||
|
||
//binding the port to ip and port
|
||
serverAddress.sin_family = AF_INET;
|
||
serverAddress.sin_port = htons(PORT);
|
||
serverAddress.sin_addr.s_addr = INADDR_ANY;
|
||
clientAddressLength = sizeof(clientAddress);
|
||
|
||
// Create receive buffer
|
||
unsigned 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...");
|
||
}
|
||
|
||
// Bind UDP Socket
|
||
if ((bind(udpServerSocket, (struct sockaddr*)&serverAddress, sizeof(serverAddress))) < 0) {
|
||
_logger.fatal.ln("binding error...");
|
||
}
|
||
|
||
while(!_stop) {
|
||
udpReadStatus = recvfrom(udpServerSocket, buffer, sizeof(buffer), 0, (struct sockaddr*)&clientAddress, &clientAddressLength);
|
||
|
||
if (udpServerSocket < 0) {
|
||
close(udpServerSocket);
|
||
_logger.warn.ln("reading error...");
|
||
}
|
||
|
||
/*
|
||
for(int i=0; i<udpReadStatus; ++i) {
|
||
//std::cout << std::hex << (char)buffer[i];
|
||
std::cout << std::setw(2) << static_cast<unsigned>(buffer[i]) << " ";
|
||
}
|
||
std::cout << std::endl << std::endl;
|
||
*/
|
||
Message* message = (Message*) &buffer;
|
||
|
||
//Spit out some header values for debugging.
|
||
_logger.warn << "ID: " << message->id();
|
||
_logger.warn << " QR: " << message->qr();
|
||
_logger.warn << " OPCode: " << message->opCode();
|
||
_logger.warn << " AA: " << message->aa();
|
||
_logger.warn << " TC: " << message->tc();
|
||
_logger.warn << " RD: " << message->rd();
|
||
_logger.warn << " RA: " << message->ra();
|
||
_logger.warn << " RCode: " << message->rCode();
|
||
_logger.warn << " QDCount: " << message->qdCount();
|
||
_logger.warn << " ANCount: " << message->anCount();
|
||
_logger.warn << " NSCount: " << message->nsCount();
|
||
_logger.warn << " ARCount: " << message->arCount();
|
||
_logger.warn << Logger::commit;
|
||
|
||
// Change message to response type and send back for testing
|
||
message->qr(Message::QR::RESPONSE);
|
||
//message->aa(Message::AA::AUTHORATATIVE);
|
||
//message->ra(Message::RA::AVAILABLE);
|
||
|
||
//if ( sendto(udpServerSocket, msg, strlen(msg), 0, (struct sockaddr*)&clientAddress, clientAddressLength) < 0 ) {
|
||
if ( sendto(udpServerSocket, message->encode(), message->encodedSize(), 0, (struct sockaddr*)&clientAddress, clientAddressLength) < 0 ) {
|
||
close(udpServerSocket);
|
||
_logger.warn.ln("sending error...");
|
||
}
|
||
}
|
||
|
||
close(udpServerSocket);
|
||
}
|
||
|
||
/*
|
||
void Server::doReceive()
|
||
{
|
||
_udpSocket->async_receive_from(
|
||
asio::buffer(_data, 1024), _sender_endpoint,
|
||
[this](std::error_code ec, std::size_t bytes_recvd)
|
||
{
|
||
if (!ec && bytes_recvd > 0) {
|
||
doSend(bytes_recvd);
|
||
}
|
||
else {
|
||
doReceive();
|
||
}
|
||
});
|
||
}
|
||
|
||
void Server::doSend(std::size_t length)
|
||
{
|
||
_udpSocket->async_send_to (
|
||
asio::buffer(_data, length), _sender_endpoint,
|
||
[this](std::error_code, std::size_t)
|
||
{
|
||
doReceive();
|
||
});
|
||
}
|
||
*/
|
||
|
||
|
||
|
||
|
||
}}
|