#include "TracyProtocolServer.hpp" #include #include #include namespace tracy { std::optional ParseBroadcastMessage(const char* msg, size_t msgLen) { if (msgLen < sizeof(uint16_t)) { std::cout << "Received too short broadcast message" << std::endl; return std::nullopt; } uint16_t broadcastVersion; memcpy(&broadcastVersion, msg, sizeof(uint16_t)); if (broadcastVersion > tracy::BroadcastVersion) { std::cout << "Received broadcast message with unsupported version: " << broadcastVersion << std::endl; return std::nullopt; } switch (broadcastVersion) { case 3: { if (msgLen > sizeof(tracy::BroadcastMessage)) { std::cout << "Received unexpected size broadcast v3 message" << std::endl; return std::nullopt; } tracy::BroadcastMessage bm; memcpy(&bm, msg, msgLen); return bm; break; } case 2: { if (msgLen > sizeof(tracy::BroadcastMessage_v2)) { std::cout << "Received unexpected size broadcast v2 message" << std::endl; return std::nullopt; } tracy::BroadcastMessage_v2 bm; memcpy(&bm, msg, msgLen); tracy::BroadcastMessage out; out.broadcastVersion = broadcastVersion; out.protocolVersion = bm.protocolVersion; out.activeTime = bm.activeTime; out.listenPort = bm.listenPort; strcpy(out.programName, bm.programName); out.pid = 0; return out; break; } case 1: { if (msgLen > sizeof(tracy::BroadcastMessage_v1)) { std::cout << "Received unexpected size broadcast v1 message" << std::endl; return std::nullopt; } tracy::BroadcastMessage_v1 bm; memcpy(&bm, msg, msgLen); tracy::BroadcastMessage out; out.broadcastVersion = broadcastVersion; out.protocolVersion = bm.protocolVersion; out.activeTime = bm.activeTime; out.listenPort = bm.listenPort; strcpy(out.programName, bm.programName); out.pid = 0; return out; break; } case 0: { if (msgLen > sizeof(tracy::BroadcastMessage_v0)) { std::cout << "Received unexpected size broadcast v0 message" << std::endl; return std::nullopt; } tracy::BroadcastMessage_v0 bm; memcpy(&bm, msg, msgLen); tracy::BroadcastMessage out; out.broadcastVersion = broadcastVersion; out.protocolVersion = bm.protocolVersion; out.activeTime = bm.activeTime; out.listenPort = tracy::DEFAULT_CLIENT_DATA_TCP_PORT; strcpy(out.programName, bm.programName); out.pid = 0; return out; break; } default: assert(false); break; } return std::nullopt; } uint64_t ClientUniqueID(tracy::IpAddress const& addr, uint16_t port) { return uint64_t(addr.GetNumber()) | (uint64_t(port) << 32); } }