void SynchronizationProtocol::asynchronousUpdate() { static double timer = StkTime::getRealTime(); double current_time = StkTime::getRealTime(); if (m_countdown_activated) { m_countdown -= (current_time - m_last_countdown_update); m_last_countdown_update = current_time; Log::debug("SynchronizationProtocol", "Update! Countdown remaining : %f", m_countdown); if (m_countdown < 0.0 && !m_has_quit) { m_has_quit = true; Log::info("SynchronizationProtocol", "Countdown finished. Starting now."); m_listener->requestStart(new KartUpdateProtocol()); m_listener->requestStart(new ControllerEventsProtocol()); m_listener->requestStart(new GameEventsProtocol()); m_listener->requestTerminate(this); return; } static int seconds = -1; if (seconds == -1) { seconds = (int)(ceil(m_countdown)); } else if (seconds != (int)(ceil(m_countdown))) { seconds = (int)(ceil(m_countdown)); Log::info("SynchronizationProtocol", "Starting in %d seconds.", seconds); } } if (current_time > timer+0.1) { std::vector<STKPeer*> peers = NetworkManager::getInstance()->getPeers(); for (unsigned int i = 0; i < peers.size(); i++) { NetworkString ns; ns.ai8(i).addUInt32(peers[i]->getClientServerToken()).addUInt8(1).addUInt32(m_pings[i].size()); // now add the countdown if necessary if (m_countdown_activated && m_listener->isServer()) { ns.addUInt32((int)(m_countdown*1000.0)); Log::debug("SynchronizationProtocol", "CNTActivated: Countdown value : %f", m_countdown); } Log::verbose("SynchronizationProtocol", "Added sequence number %u for peer %d", m_pings[i].size(), i); timer = current_time; m_pings[i].insert(std::pair<int,double>(m_pings_count[i], timer)); m_listener->sendMessage(this, peers[i], ns, false); m_pings_count[i]++; } } }
// ---------------------------------------------------------------------------- void STKHost::handleLANRequests() { const int LEN=2048; char buffer[LEN]; TransportAddress sender; int len = m_lan_network->receiveRawPacket(buffer, LEN, &sender, 1); if(len<=0) return; if (std::string(buffer, len) == "stk-server") { Log::verbose("STKHost", "Received LAN server query"); std::string name = StringUtils::wideToUtf8(NetworkConfig::get()->getServerName()); // Avoid buffer overflows if (name.size() > 255) name = name.substr(0, 255); // Send the answer, consisting of server name, max players, // current players, and the client's ip address and port // number (which solves the problem which network interface // might be the right one if there is more than one). NetworkString s; s.encodeString(name); s.addUInt8(NetworkConfig::get()->getMaxPlayers()); s.addUInt8(0); // FIXME: current number of connected players s.addUInt32(sender.getIP()); s.addUInt16(sender.getPort()); m_lan_network->sendRawPacket(s.getBytes(), s.size(), sender); } // if message is server-requested else if (std::string(buffer, len) == "connection-request") { Protocol *c = new ConnectToPeer(sender); c->requestStart(); } else Log::info("STKHost", "Received unknown command '%s'", std::string(buffer, len).c_str()); } // handleLANRequests