diff --git a/gameparser.cpp b/gameparser.cpp index 1391579..6fbad16 100644 --- a/gameparser.cpp +++ b/gameparser.cpp @@ -39,5 +39,5 @@ int GameParser::execute(void* arg) void GameParser::cleanup() { - LogSystem::log(LOG_DEBUG, "GameParser::cleanup()"); +// LogSystem::log(LOG_DEBUG, "GameParser::cleanup()"); } diff --git a/hlswmaster.cpp b/hlswmaster.cpp index 36f5dbd..43cf2bf 100644 --- a/hlswmaster.cpp +++ b/hlswmaster.cpp @@ -86,11 +86,11 @@ int main(int argc, char *argv[]) GameParser parser(conf, scanner, modList); HlswServer server(conf, parser); - modList.reg(new ModHalfLife()); - modList.reg(new ModQ3Engine()); - modList.reg(new ModD3Engine()); - modList.reg(new ModGameSpy1()); - modList.reg(new ModGameSpy2()); +// modList.reg(new ModHalfLife()); +// modList.reg(new ModQ3Engine()); +// modList.reg(new ModD3Engine()); +// modList.reg(new ModGameSpy1()); +// modList.reg(new ModGameSpy2()); server.start(); parser.start(); diff --git a/hlswserver.cpp b/hlswserver.cpp index 8bb87dd..5423f25 100644 --- a/hlswserver.cpp +++ b/hlswserver.cpp @@ -9,9 +9,43 @@ #include "logging.h" #include "hlswserver.h" -#define HLSW_HEADER "\xFF\xFF\xFF\xFFHLSWLANSEARCH\x00" -#define HLSW_HEADER_LEN 0x12 #define HLSW_MASTER_PORT 7140 +static const char hlsw_header[] = "\xFF\xFF\xFF\xFFHLSWLANSEARCH"; + +HlswServer::HlswPacket::HlswPacket(HlswPacket* next) +: next(next), count(0) +{ + memcpy(data, hlsw_header, sizeof(hlsw_header)); + memset(data + sizeof(hlsw_header), 0, sizeof(data) - sizeof(hlsw_header)); +} + +HlswServer::HlswPacket::~HlswPacket() +{ + if (next) + delete next; +} + +bool HlswServer::HlswPacket::addGame(void* ptr) +{ + if (count < 140) { + count++; + + return true; + } else { + return false; + } +} + +void HlswServer::HlswPacket::send(int socket, struct sockaddr_in* dst) +{ + if (next) + next->send(socket, dst); + + if (sendto(socket, data, sizeof(hlsw_header) + count * 10, 0, + (struct sockaddr *)dst, sizeof(*dst)) < 0) { + LogSystem::log(LOG_WARN, "HlswPacket::send()"); + } +} HlswServer::HlswServer(Config& conf, GameList& slist) { @@ -35,12 +69,13 @@ HlswServer::HlswServer(Config& conf, GameList& slist) return; } - out = new HlswPacket(); + pktlist = new HlswPacket(NULL); } HlswServer::~HlswServer() { close(sock); + delete pktlist; } int HlswServer::execute(void* arg) @@ -54,25 +89,40 @@ int HlswServer::execute(void* arg) /* auf clientanfrage warten */ len = sizeof(src); ret = recvfrom(sock, buf, sizeof(buf), 0, (struct sockaddr *)&src, &len); - if (ret != HLSW_HEADER_LEN) { + + if (ret != sizeof(hlsw_header)) { LogSystem::log(LOG_NOTICE, "HlswServer: invalid packet"); continue; } /* testen ob es sich um ein HLSW anforderung handelt */ - if (memcmp(buf, HLSW_HEADER, HLSW_HEADER_LEN)) { + if (memcmp(buf, hlsw_header, sizeof(hlsw_header))) { LogSystem::log(LOG_NOTICE, "HlswServer: not a hlsw packet"); continue; } - if (out != NULL && out->count > 0) { - HlswPacket* pkt; - for (pkt = out; pkt != NULL; pkt = pkt->next) { - sendto(sock, pkt->data, pkt->getSize(), 0, - (struct sockaddr *)&src, sizeof(src)); - } - } + mutex.lock(); + pktlist->send(sock, &src); + mutex.unlock(); } - return 0; } + +/* + HlswPacket* newlist; + while (it->hasNext()) { + Data* d = it->next(); + if (!newlist || !newlist->add(d)) + newlist = new HlswPacket(newlist); + newlist->add(d); + } + } + + mutex.lock(); + HlswPacket* oldlist = pktlist; + pktlist = newlist; + mutex.unlock(); + + delete oldlist; +*/ + diff --git a/hlswserver.h b/hlswserver.h index 5662081..a86050c 100644 --- a/hlswserver.h +++ b/hlswserver.h @@ -6,7 +6,7 @@ #include "thread.h" #include "config.h" #include "gamelist.h" - +#include "mutex.h" class HlswServer : public Thread { public: @@ -22,24 +22,20 @@ protected: private: class HlswPacket { public: - HlswPacket() : next(0), count(0) - { - memset(data, 0, sizeof(data)); - } + HlswPacket(HlswPacket* next); + ~HlswPacket(); - int getSize() - { - return 12 + count * 10; - } - - void addGame(void* ptr) {} + bool addGame(void* ptr); + void send(int socket, struct sockaddr_in* dst); + private: HlswPacket* next; int count; - char data[1412]; + char data[1418]; }; - HlswPacket* out; + HlswPacket* pktlist; + Mutex mutex; int sock; };