diff --git a/Core/GameEngine/Source/GameNetwork/ConnectionManager.cpp b/Core/GameEngine/Source/GameNetwork/ConnectionManager.cpp index 9ea8927d696..affe2449585 100644 --- a/Core/GameEngine/Source/GameNetwork/ConnectionManager.cpp +++ b/Core/GameEngine/Source/GameNetwork/ConnectionManager.cpp @@ -459,13 +459,10 @@ void ConnectionManager::destroyGameMessages() { * assumption that a command will only be relayed once. */ void ConnectionManager::doRelay() { - static Int numPackets = 0; - static Int numCommands = 0; - NetPacket *packet = nullptr; - for (Int i = 0; i < MAX_MESSAGES; ++i) { - if (m_transport->m_inBuffer[i].length != 0) { + for (size_t i = 0; i < ARRAY_SIZE(m_transport->m_inBuffer); ++i) { + if (m_transport->m_inBuffer[i].length > 0) { // This transport buffer has yet to be processed. // make a NetPacket out of this data so it can be broken up into individual commands. @@ -476,23 +473,19 @@ void ConnectionManager::doRelay() { // Get the command list from the packet. NetCommandList *cmdList = packet->getCommandList(); - NetCommandRef *cmd = cmdList->getFirstMessage(); // Iterate through the commands in this packet and send them to the proper connections. - while (cmd != nullptr) { + for (NetCommandRef* cmd = cmdList->getFirstMessage(); cmd; cmd = cmd->getNext()) { //DEBUG_LOG(("ConnectionManager::doRelay() - Looking at a command of type %s", //GetNetCommandTypeAsString(cmd->getCommand()->getNetCommandType()))); + if (CommandRequiresAck(cmd->getCommand())) { ackCommand(cmd, m_localSlot); } if (!processNetCommand(cmd)) { sendRemoteCommand(cmd); } - cmd = cmd->getNext(); - - ++numCommands; } - ++numPackets; // Delete this packet since we won't be needing it anymore. deleteInstance(packet); @@ -503,23 +496,20 @@ void ConnectionManager::doRelay() { // signal that this has been processed. m_transport->m_inBuffer[i].length = 0; + } else { + break; } } NetCommandList *cmdList = m_netCommandWrapperList->getReadyCommands(); - NetCommandRef *cmd = cmdList->getFirstMessage(); - while (cmd != nullptr) { + for (NetCommandRef* cmd = cmdList->getFirstMessage(); cmd; cmd = cmd->getNext()) { if (CommandRequiresAck(cmd->getCommand())) { ackCommand(cmd, m_localSlot); } if (!processNetCommand(cmd)) { sendRemoteCommand(cmd); } - cmd = cmd->getNext(); - - ++numCommands; } - ++numPackets; // Delete this packet since we won't be needing it anymore. deleteInstance(packet); diff --git a/Core/GameEngine/Source/GameNetwork/LANAPI.cpp b/Core/GameEngine/Source/GameNetwork/LANAPI.cpp index 1016d26f66b..8cbfbdea6c5 100644 --- a/Core/GameEngine/Source/GameNetwork/LANAPI.cpp +++ b/Core/GameEngine/Source/GameNetwork/LANAPI.cpp @@ -341,8 +341,7 @@ void LANAPI::update() } // Handle any new messages - int i; - for (i=0; im_inBuffer) && !LANbuttonPushed; ++i) { if (m_transport->m_inBuffer[i].length > 0) { @@ -432,6 +431,10 @@ void LANAPI::update() // Mark it as read m_transport->m_inBuffer[i].length = 0; } + else + { + break; + } } if(LANbuttonPushed) return; diff --git a/Core/GameEngine/Source/GameNetwork/NAT.cpp b/Core/GameEngine/Source/GameNetwork/NAT.cpp index 159d8532cfa..d68470b0505 100644 --- a/Core/GameEngine/Source/GameNetwork/NAT.cpp +++ b/Core/GameEngine/Source/GameNetwork/NAT.cpp @@ -325,7 +325,7 @@ NATConnectionState NAT::connectionUpdate() { m_transport->update(); // check to see if we've been probed. - for (Int i = 0; i < MAX_MESSAGES; ++i) { + for (size_t i = 0; i < ARRAY_SIZE(m_transport->m_inBuffer); ++i) { if (m_transport->m_inBuffer[i].length > 0) { #ifdef DEBUG_LOGGING UnsignedInt ip = m_transport->m_inBuffer[i].addr; @@ -368,6 +368,8 @@ NATConnectionState NAT::connectionUpdate() { PRINTF_IP_AS_4_INTS(ip), m_transport->m_inBuffer[i].port)); m_transport->m_inBuffer[i].length = 0; } + } else { + break; } } diff --git a/Core/GameEngine/Source/GameNetwork/Transport.cpp b/Core/GameEngine/Source/GameNetwork/Transport.cpp index 04dc7d624f5..cbdbcb88222 100644 --- a/Core/GameEngine/Source/GameNetwork/Transport.cpp +++ b/Core/GameEngine/Source/GameNetwork/Transport.cpp @@ -211,10 +211,9 @@ Bool Transport::doSend() { } // Send all messages - int i; - for (i=0; i 0) { int bytesSent = 0; // TheSuperHackers @info The handling of data sizing of the payload within a UDP packet is confusing due to the current networking implementation @@ -249,17 +248,20 @@ Bool Transport::doSend() { // Latency simulation - deliver anything we're holding on to that is ready if (m_useLatency) { - for (i=0; i 0 && m_delayedInBuffer[i].deliveryTime <= now) { - for (int j=0; jRead(buf, MAX_NETWORK_MESSAGE_LEN, &from)) > 0 ) { @@ -330,43 +333,47 @@ Bool Transport::doRecv() m_incomingPackets[m_statisticsSlot]++; m_incomingBytes[m_statisticsSlot] += len; - for (int i=0; im_latencyAverage + (Int)(TheGlobalData->m_latencyAmplitude * sin(now * TheGlobalData->m_latencyPeriod)) + GameClientRandomValue(-TheGlobalData->m_latencyNoise, TheGlobalData->m_latencyNoise); - m_delayedInBuffer[i].message.length = incomingMessage.length; - m_delayedInBuffer[i].message.addr = ntohl(from.sin_addr.S_un.S_addr); - m_delayedInBuffer[i].message.port = ntohs(from.sin_port); - memcpy(&m_delayedInBuffer[i].message, buf, len); + m_delayedInBuffer[bufferIndex].message.length = incomingMessage.length; + m_delayedInBuffer[bufferIndex].message.addr = ntohl(from.sin_addr.S_un.S_addr); + m_delayedInBuffer[bufferIndex].message.port = ntohs(from.sin_port); + memcpy(&m_delayedInBuffer[bufferIndex].message, buf, len); + ++bufferIndex; break; } } - else - { + + continue; + } #endif - if (m_inBuffer[i].length == 0) - { - // Empty slot; use it - m_inBuffer[i].length = incomingMessage.length; - m_inBuffer[i].addr = ntohl(from.sin_addr.S_un.S_addr); - m_inBuffer[i].port = ntohs(from.sin_port); - memcpy(&m_inBuffer[i], buf, len); - break; - } -#if defined(RTS_DEBUG) + + for (; bufferIndex < ARRAY_SIZE(m_inBuffer); ++bufferIndex) + { + if (m_inBuffer[bufferIndex].length <= 0) + { + // Empty slot; use it + m_inBuffer[bufferIndex].length = incomingMessage.length; + m_inBuffer[bufferIndex].addr = ntohl(from.sin_addr.S_un.S_addr); + m_inBuffer[bufferIndex].port = ntohs(from.sin_port); + memcpy(&m_inBuffer[bufferIndex], buf, len); + ++bufferIndex; + break; } -#endif } - //DEBUG_ASSERTCRASH(i MAX_PACKET_SIZE) { DEBUG_LOG(("Transport::queueSend - Invalid Packet size")); return false; } - for (i=0; i