/** * @brief serverside network receiver * * Plugin for the CGameServer network code in GameServer.cpp. * @return the number of bytes read from the network stream */ bool CSyncDebugger::ServerReceived(const unsigned char* inbuf) { bool syncDebugPacket = false; switch (inbuf[0]) { case NETMSG_SD_CHKRESPONSE: if (*(short*)&inbuf[1] != HISTORY_SIZE * sizeof(unsigned) + 12) { logger.AddLine("Server: received checksum response of %d instead of %d bytes", *(short*)&inbuf[1], HISTORY_SIZE * 4 + 12); } else { int player = inbuf[3]; if(player >= playerHandler->ActivePlayers() || player < 0) { logger.AddLine("Server: got invalid playernum %d in checksum response", player); } else { logger.AddLine("Server: got checksum response from %d", player); const unsigned* begin = (unsigned*)&inbuf[12]; const unsigned* end = begin + HISTORY_SIZE; players[player].checksumResponses.resize(HISTORY_SIZE); std::copy(begin, end, players[player].checksumResponses.begin()); players[player].remoteFlop = *(uint64_t*)&inbuf[4]; assert(!players[player].checksumResponses.empty()); int i = 0; while (i < playerHandler->ActivePlayers() && !players[i].checksumResponses.empty()) ++i; if (i == playerHandler->ActivePlayers()) { ServerQueueBlockRequests(); logger.AddLine("Server: checksum responses received; %d block requests queued", pendingBlocksToRequest.size()); } } } syncDebugPacket = true; break; case NETMSG_SD_BLKRESPONSE: if (*(short*)&inbuf[1] != BLOCK_SIZE * sizeof(unsigned) + 4) { logger.AddLine("Server: received block response of %d instead of %d bytes", *(short*)&inbuf[1], BLOCK_SIZE * 4 + 4); } else { int player = inbuf[3]; if(player >= playerHandler->ActivePlayers() || player < 0) { logger.AddLine("Server: got invalid playernum %d in block response", player); } else { const unsigned* begin = (unsigned*)&inbuf[4]; const unsigned* end = begin + BLOCK_SIZE; unsigned size = players[player].remoteHistory.size(); players[player].remoteHistory.resize(size + BLOCK_SIZE); std::copy(begin, end, players[player].remoteHistory.begin() + size); int i = 0; size += BLOCK_SIZE; while (i < playerHandler->ActivePlayers() && size == players[i].remoteHistory.size()) ++i; if (i == playerHandler->ActivePlayers()) { logger.AddLine("Server: block responses received"); ServerReceivedBlockResponses(); } } } syncDebugPacket = true; break; default: logger.AddLine("Server: unknown packet"); break; } logger.FlushBuffer(); return syncDebugPacket; }
/** * @brief serverside network receiver * * Plugin for the CGameServer network code in GameServer.cpp. * @return the number of bytes read from the network stream */ int CSyncDebugger::ServerReceived(const unsigned char* inbuf) { int length = 0; switch (inbuf[0]) { case NETMSG_SD_CHKRESPONSE: if (*(short*)&inbuf[1] != HISTORY_SIZE * sizeof(unsigned) + 12) { logger.AddLine("Server: received checksum response of %d instead of %d bytes", *(short*)&inbuf[1], HISTORY_SIZE * 4 + 12); } else { int player = inbuf[3]; if(player >= gs->activeTeams || player < 0) { logger.AddLine("Server: got invalid playernum %d in checksum response", player); } else { const unsigned* begin = (unsigned*)&inbuf[12]; const unsigned* end = begin + HISTORY_SIZE; checksumResponses[player].resize(HISTORY_SIZE); std::copy(begin, end, checksumResponses[player].begin()); remoteFlop[player] = *(Uint64*)&inbuf[4]; int i = 0; while (i < gs->activeTeams && !checksumResponses[i].empty()) ++i; if (i == gs->activeTeams) { ServerQueueBlockRequests(); logger.AddLine("Server: checksum responses received; %d block requests queued", pendingBlocksToRequest.size()); } } } length = *(short*)&inbuf[1]; break; case NETMSG_SD_BLKRESPONSE: if (*(short*)&inbuf[1] != BLOCK_SIZE * sizeof(unsigned) + 4) { logger.AddLine("Server: received block response of %d instead of %d bytes", *(short*)&inbuf[1], BLOCK_SIZE * 4 + 4); } else { int player = inbuf[3]; if(player >= gs->activeTeams || player < 0) { logger.AddLine("Server: got invalid playernum %d in block response", player); } else { const unsigned* begin = (unsigned*)&inbuf[4]; const unsigned* end = begin + BLOCK_SIZE; unsigned size = remoteHistory[player].size(); remoteHistory[player].resize(size + BLOCK_SIZE); std::copy(begin, end, remoteHistory[player].begin() + size); int i = 0; size += BLOCK_SIZE; while (i < gs->activeTeams && size == remoteHistory[i].size()) ++i; if (i == gs->activeTeams) { logger.AddLine("Server: block responses received"); ServerReceivedBlockResponses(); } } } length = *(short*)&inbuf[1]; break; default: logger.AddLine("Server: invalid msg"); length = 0; break; } return length; }