From 9ef44a3993de7b65c550ccc491cb3f9ae49d22bb Mon Sep 17 00:00:00 2001 From: Marc-Eric Martel Date: Fri, 27 Oct 2023 09:51:40 -0400 Subject: [PATCH] Ev'ryday I'm bufferin'. --- SQCSim-common/netprotocol.h | 6 +-- SQCSim-srv/define.h | 3 -- SQCSim-srv/server.cpp | 100 +++++++++++++++++++++++++----------- SQCSim-srv/server.h | 23 ++++----- 4 files changed, 82 insertions(+), 50 deletions(-) diff --git a/SQCSim-common/netprotocol.h b/SQCSim-common/netprotocol.h index 23e9c4a..8cbcba5 100644 --- a/SQCSim-common/netprotocol.h +++ b/SQCSim-common/netprotocol.h @@ -20,7 +20,7 @@ namespace netprot { struct Buffer { // Pour pouvoir rendre l'utilisation des buffers plus clean. char* ptr = new char[BUFFER_LENGTH]; - int32_t len = BUFFER_LENGTH; + uint32_t len = BUFFER_LENGTH; ~Buffer() { delete[] ptr; } void rstLen() { len = BUFFER_LENGTH; } @@ -157,7 +157,7 @@ namespace netprot { template void sendPack(SOCKET sock, T* pack, Buffer* buf) { - netprot::Serialize(pack, buf->ptr, buf->len); + netprot::Serialize(pack, &buf->ptr, &buf->len); send(sock, buf->ptr, buf->len, 0); buf->rstLen(); } @@ -165,7 +165,7 @@ namespace netprot { template void sendPackTo(SOCKET sock, T* pack, Buffer* buf, sockaddr_in* sockad) { sockaddr_in addr = *sockad; - netprot::Serialize(pack, buf->ptr, buf->len); + netprot::Serialize(pack, &buf->ptr, &buf->len); sendto(sock, buf->ptr, buf->len, 0, (sockaddr*)&addr, sizeof(addr)); buf->rstLen(); } diff --git a/SQCSim-srv/define.h b/SQCSim-srv/define.h index eaf044e..3951791 100644 --- a/SQCSim-srv/define.h +++ b/SQCSim-srv/define.h @@ -15,7 +15,4 @@ #define strcpy strcpy_s #endif -typedef unsigned char LogDest; -enum LOG_DEST { CONSOLE, LOGFILE, LOG_LAST }; - #endif diff --git a/SQCSim-srv/server.cpp b/SQCSim-srv/server.cpp index 90cce82..c47591a 100644 --- a/SQCSim-srv/server.cpp +++ b/SQCSim-srv/server.cpp @@ -1,6 +1,6 @@ #include "server.h" -Server::Server(LogDest log) { +Server::Server(LOG_DEST log) { m_log = log; if (log == LOG_DEST::LOGFILE) { m_logfile = std::ofstream("server.log", std::ofstream::out); @@ -70,25 +70,21 @@ int Server::Init() { int Server::Ready() { int nbrjoueurs = 0, nbrconn = 0; - char *buf = new char[BUFFER_LENGTH], - *strbuf = new char[BUFFER_LENGTH]; - uint32_t buflen = BUFFER_LENGTH, - strbuflen = BUFFER_LENGTH; bool readystart = false; do { Log("Entrez la duree de la partie: ", false, false); - std::cin.getline(strbuf, BUFFER_LENGTH); - m_game.countdown = std::stoi(strbuf); + std::cin.getline(m_buf.ptr, BUFFER_LENGTH); + m_game.countdown = std::stoi(m_buf.ptr); } while (m_game.countdown < 1); do { Log("Entrez le seed de la partie: ", false, false); - std::cin.getline(strbuf, BUFFER_LENGTH); - m_game.seed = std::stoi(strbuf); + std::cin.getline(m_buf.ptr, BUFFER_LENGTH); + m_game.seed = std::stoi(m_buf.ptr); } while (m_game.seed < 1); do { Log("Entrez le nombre de joueurs: ", false, false); - std::cin.getline(strbuf, BUFFER_LENGTH); - nbrjoueurs = std::stoi(strbuf); + std::cin.getline(m_buf.ptr, BUFFER_LENGTH); + nbrjoueurs = std::stoi(m_buf.ptr); } while (nbrjoueurs > 0 && nbrjoueurs >= MAX_CONNECTIONS); m_game.gameType = 1; @@ -111,13 +107,13 @@ int Server::Ready() { Log("Erreur de connexion", true, false); else if (sock > 0) { std::string str = "Nouvelle connexion provenant de: "; - str.append(inet_ntop(AF_INET, &sockad.sin_addr, strbuf, strbuflen)).append(": ").append(std::to_string(sockad.sin_port)); + str.append(inet_ntop(AF_INET, &sockad.sin_addr, m_buf.ptr, m_buf.len)).append(": ").append(std::to_string(sockad.sin_port)); - if (recv(sock, buf, buflen, 0) > 0) { + if (recv(sock, m_buf.ptr, m_buf.len, 0) > 0) { LoginInfo* log; PlayerInfo play; - Packet pck = getPack(buf, buflen); + Packet pck = getPack(&m_buf); if (pck.type != PACKET_TYPE::LOGINF) { Log("Paquet invalide.", true, false); if (pck.type != PACKET_TYPE::ERR) @@ -134,21 +130,19 @@ int Server::Ready() { Log(str.append(log->name).append(" SID: [").append(std::to_string(log->sid).append("]")), false, false); - sendPack(sock, log, &buf, &buflen); + sendPack(sock, log, &m_buf.ptr, &m_buf.len); play.id = getUniqueId(); strcpy(play.name, log->name); play.tid = log->tid; - sendPack(sock, &m_game, &buf, &buflen); + sendPack(sock, &m_game, &m_buf.ptr, &m_buf.len); Connection* conn = new Connection(sock, sockad, *log, play); for (auto& [key, player] : m_players) { - sendPack(player->getSock(), &play, &buf, &buflen); // Envoyer les infos de joueur distant aux joueurs d�j� connect�s - buflen = BUFFER_LENGTH; - sendPack(sock, player->getInfo(), &buf, &buflen); // et envoyer les infos des joueurs distants au nouveau joueur. - buflen = BUFFER_LENGTH; + sendPack(player->getSock(), &play, &m_buf); // Envoyer les infos de joueur distant aux joueurs d�j� connect�s + sendPack(sock, player->getInfo(), &m_buf); // et envoyer les infos des joueurs distants au nouveau joueur. } m_players[log->sid] = conn; @@ -158,14 +152,10 @@ int Server::Ready() { } } } - delete[] buf; - delete[] strbuf; return 0; } void Server::Run() { - char* buf = new char[BUFFER_LENGTH]; - uint32_t buflen = BUFFER_LENGTH; Input in; sockaddr_in sockad; addrlen_t socklen = sizeof(sockad); @@ -182,16 +172,64 @@ void Server::Run() { sync.ammo = 0; sync.timestamp = 0; sync.timer = m_game.countdown; - sendPackTo(conn->getSock(), &sync, &buf, &buflen, conn->getAddr()); + sendPackTo(conn->getSock(), &sync, &m_buf, conn->getAddr()); } while (true) { - if (recvfrom(m_sock_udp, buf, BUFFER_LENGTH, 0, (sockaddr*)&sockad, &socklen) > 0) { - Deserialize(&in, buf, buflen); - std::cout << "Id: " << in.sid << "\r\n" - << "Direction: { " << in.direction.x << ", " << in.direction.y << ", " << in.direction.z << " }" << "\r\n"; - } - std::cout << "!" << std::endl; + if (recvfrom(m_sock_udp, m_buf.ptr, m_buf.len, 0, (sockaddr*)&sockad, &socklen) > 0) { + Packet pck = getPack(&m_buf); + switch (pck.type) { + case netprot::PACKET_TYPE::ERR: + std::cout << "ERROR!" << std::endl; + break; + case netprot::PACKET_TYPE::INPUT: + std::cout << "INPUT!" << std::endl; + break; + case netprot::PACKET_TYPE::OUTPUT: + std::cout << "OUTPUT!" << std::endl; + break; + case netprot::PACKET_TYPE::SYNC: + std::cout << "SYNC!" << std::endl; + break; + case netprot::PACKET_TYPE::TEAMINF: + std::cout << "TEAMINF!" << std::endl; + break; + case netprot::PACKET_TYPE::SELFINF: + std::cout << "SELFINF!" << std::endl; + break; + case netprot::PACKET_TYPE::PLAYINF: + std::cout << "PLAYINF!" << std::endl; + break; + case netprot::PACKET_TYPE::LOGINF: + std::cout << "LOGINF!" << std::endl; + break; + case netprot::PACKET_TYPE::CHUNKMOD: + std::cout << "CHUNKMOD!" << std::endl; + break; + case netprot::PACKET_TYPE::PLAYERMOD: + std::cout << "PLAYERMOD!" << std::endl; + break; + case netprot::PACKET_TYPE::PICKUPMOD: + std::cout << "PICKUPMOD!" << std::endl; + break; + case netprot::PACKET_TYPE::GAMEINFO: + std::cout << "GAMEINFO!" << std::endl; + break; + case netprot::PACKET_TYPE::ENDINFO: + std::cout << "ENDINFO!" << std::endl; + break; + case netprot::PACKET_TYPE::CHAT: + std::cout << "CHAT!" << std::endl; + break; + case netprot::PACKET_TYPE::ERRLOG: + std::cout << "ERRLOG!" << std::endl; + break; + case netprot::PACKET_TYPE::LAST_PACK: + std::cout << "wtf?!" << std::endl; + break; + } + emptyPack(pck); + } } } diff --git a/SQCSim-srv/server.h b/SQCSim-srv/server.h index a66f885..33b529f 100644 --- a/SQCSim-srv/server.h +++ b/SQCSim-srv/server.h @@ -14,7 +14,9 @@ using namespace netprot; class Server { public: - Server(LogDest log = LOG_DEST::CONSOLE); + enum LOG_DEST: unsigned char { CONSOLE, LOGFILE, LOG_LAST }; + + Server(LOG_DEST log = LOG_DEST::CONSOLE); ~Server(); int Init(); @@ -22,18 +24,21 @@ public: void Run(); private: + #ifdef _WIN32 WSADATA m_wsaData; #endif SOCKET m_sock_udp = 0, m_sock_tcp = 0; - LogDest m_log; + LOG_DEST m_log; std::ofstream m_logfile; + Buffer m_buf; + std::map m_players; - std::map m_chatlog; + std::map m_chatlog; std::vector m_ids; - netprot::GameInfo m_game; + GameInfo m_game; World* m_world = nullptr; const bool m_manual_setup = SRV_MANUAL_SETUP; @@ -42,16 +47,8 @@ private: void Log(std::string str, bool is_error, bool is_fatal); void buildIdList(size_t size); - uint64_t getUniqueId(); - //template void sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen); + uint64_t getUniqueId(); }; -//template -//void Server::sendPack(SOCKET sock, T* pack, char** buf, uint32_t* buflen) { -// netprot::Serialize(pack, buf, buflen); -// send(sock, *buf, *buflen, 0); -// *buflen = BUFFER_LENGTH; -//} - #endif