diff --git a/src/client/client.cpp b/src/client/client.cpp index 5d4793c8a..315fcd410 100644 --- a/src/client/client.cpp +++ b/src/client/client.cpp @@ -311,6 +311,7 @@ void Client::connect(Address address, bool is_local_server) { initLocalMapSaving(address, m_address_name, is_local_server); + // Since we use TryReceive() a timeout here would be ineffective anyway m_con->SetTimeoutMs(0); m_con->Connect(address); } @@ -795,36 +796,31 @@ void Client::initLocalMapSaving(const Address &address, void Client::ReceiveAll() { + NetworkPacket pkt; u64 start_ms = porting::getTimeMs(); - for(;;) - { + const u64 budget = 100; + for(;;) { // Limit time even if there would be huge amounts of data to // process - if(porting::getTimeMs() > start_ms + 100) + if (porting::getTimeMs() > start_ms + budget) { + infostream << "Client::ReceiveAll(): " + "Packet processing budget exceeded." << std::endl; break; + } + pkt.clear(); try { - Receive(); - g_profiler->graphAdd("client_received_packets", 1); - } - catch(con::NoIncomingDataException &e) { - break; - } - catch(con::InvalidIncomingDataException &e) { - infostream<<"Client::ReceiveAll(): " + if (!m_con->TryReceive(&pkt)) + break; + ProcessData(&pkt); + } catch (const con::InvalidIncomingDataException &e) { + infostream << "Client::ReceiveAll(): " "InvalidIncomingDataException: what()=" - <Receive(&pkt); - ProcessData(&pkt); -} - inline void Client::handleCommand(NetworkPacket* pkt) { const ToClientCommandHandler& opHandle = toClientCommandTable[pkt->getCommand()]; @@ -841,6 +837,7 @@ void Client::ProcessData(NetworkPacket *pkt) //infostream<<"Client: received command="<graphAdd("client_received_packets", 1); /* If this check is removed, be sure to change the queue diff --git a/src/client/client.h b/src/client/client.h index 0e0765cae..10608ccf9 100644 --- a/src/client/client.h +++ b/src/client/client.h @@ -453,7 +453,6 @@ private: bool is_local_server); void ReceiveAll(); - void Receive(); void sendPlayerPos();