#include "Server.h" #include "Protocoll.h" #include #include #include Server::Server(int port) : m_maxClients(constants::MAX_CLIENTS), m_clientConnected{0} { udpSocket = SDLNet_UDP_Open(port); if (udpSocket == nullptr) { std::cout << "\tSDLNet_UDP_Open failed : " << SDLNet_GetError() << std::endl; } std::cout << "Server was started and is listening on port: " << port << std::endl; //Creating ConnectionAccepted packet! // Allocate udp packet with 512 byte size connectionAccepted = SDLNet_AllocPacket(512); if (connectionAccepted == nullptr) { std::cout << "\tSDLNet_AllocPacket failed : " << SDLNet_GetError() << std::endl; } ConnectionAccepted conAcc = ConnectionAccepted(); memcpy(connectionAccepted->data, &conAcc, sizeof(ConnectionAccepted)); connectionAccepted->len = sizeof(ConnectionAccepted); connectionDenied = SDLNet_AllocPacket(512); if (connectionDenied == nullptr) { std::cout << "\tSDLNet_AllocPacket failed : " << SDLNet_GetError() << std::endl; } ConnectionDenied conDen = ConnectionDenied(); memcpy(connectionDenied->data, &conDen, sizeof(ConnectionDenied)); connectionDenied->len = sizeof(ConnectionDenied); //Creating receiver packet! receivedPacket = SDLNet_AllocPacket(512); if (receivedPacket == nullptr) { std::cout << "\tSDLNet_AllocPacket failed : " << SDLNet_GetError() << std::endl; } } int Server::FindFreeClientIndex() const { for (int i = 0; i < m_maxClients; ++i) { if (!m_clientConnected[i]) return i; } return -1; } int Server::FindExistingClientIndex(const IPaddress &ip) const { for (int i = 0; i < m_maxClients; ++i) { if (m_clientConnected[i] && m_clients[i].host == ip.host && m_clients[i].port == ip.port) return i; } return -1; } bool Server::IsClientConnected(int clientIndex) const { return m_clientConnected[clientIndex]; } const IPaddress &Server::GetClientAddress(int clientIndex) const { return m_clients[clientIndex]; } void Server::update(unsigned int delta) { //Receive packages if (SDLNet_UDP_Recv(udpSocket, receivedPacket)) { switch (*(receivedPacket->data)) { case CONNECTION_REQUEST: std::cout << "Connection request package received\n"; int freeIndex; if ((freeIndex = this->FindFreeClientIndex()) == -1) { std::cout << "Connection denied because server full" << std::endl; //Send Connection denied this->sendConnectionDenied(receivedPacket->address); break; } std::cout << "Free index found: " << freeIndex << std::endl; int indexOfExistingClient; if ((indexOfExistingClient = FindExistingClientIndex(receivedPacket->address)) == -1) { std::cout << "Client doesent exist create new" << std::endl; m_clients[freeIndex] = receivedPacket->address; m_clientConnected[freeIndex] = true; //Send connection accepted with index this->sendConnectionAccepted(receivedPacket->address, freeIndex); m_numConnectedClients++; break; } else { std::cout << "Client exist sending accepted" << std::endl; //Send connection accepted with index this->sendConnectionAccepted(receivedPacket->address, indexOfExistingClient); } break; default: break; } } //Wait 10 sec using namespace std::chrono_literals; std::this_thread::sleep_for(1s); //Send data /*for(auto &value: clients) { value.send(this->udpSocket,*helloWorldPacket); } std::cout << "Data was send!!" << std::endl;*/ } bool Server::sendPacket(UDPpacket &packet) { // Send // SDLNet_UDP_Send returns number of packets sent. 0 means error if (SDLNet_UDP_Send(this->udpSocket, -1, &packet) == 0) { std::cout << "\tSDLNet_UDP_Send failed : " << SDLNet_GetError() << "\n" << "==========================================================================================================\n"; return false; } return true; } bool Server::sendConnectionDenied(IPaddress dest) { this->connectionDenied->address.host = dest.host; this->connectionDenied->address.port = dest.port; return this->sendPacket(*connectionDenied); } bool Server::sendConnectionAccepted(IPaddress dest, int index) { this->connectionAccepted->address.host = dest.host; this->connectionAccepted->address.port = dest.port; ((ConnectionAccepted *) connectionAccepted->data)->index = index; return this->sendPacket(*connectionAccepted); } Server::~Server() { SDLNet_FreePacket(receivedPacket); SDLNet_FreePacket(connectionAccepted); SDLNet_UDP_Close(udpSocket); }