Skip to content

Commit c5ef52b

Browse files
chernikovdmitryangelskieglazki
authored andcommitted
BACKEND-200: Allow retransmit packets on ratelimit (#1)
1 parent 1e724c3 commit c5ef52b

File tree

4 files changed

+30
-1
lines changed

4 files changed

+30
-1
lines changed

include/steam/isteamnetworkingsockets.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -299,6 +299,11 @@ class ISteamNetworkingSockets
299299
/// -k_EResultInvalidState if the connection was in an invalid state.
300300
/// See ISteamNetworkingSockets::SendMessageToConnection for possible
301301
/// failure codes.
302+
/// NOTE: @LowKick
303+
/// Fixed, don't skip any messages.
304+
/// if it get k_EResultLimitExceeded for some message it will stop sending to this overloaded
305+
/// connection and mark all subsequent messages to this connection as k_EResultLimitExceeded
306+
/// allowing caller to retransmit it later
302307
virtual void SendMessages( int nMessages, SteamNetworkingMessage_t *const *pMessages, int64 *pOutMessageNumberOrResult ) = 0;
303308

304309
/// Flush any messages waiting on the Nagle timer and send them

src/steamnetworkingsockets/clientlib/csteamnetworkingsockets.cpp

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1333,6 +1333,28 @@ void CSteamNetworkingSockets::SendMessages( int nMessages, SteamNetworkingMessag
13331333
// Return result for this message if they asked for it
13341334
if ( pOutMessageNumberOrResult )
13351335
pOutMessageNumberOrResult[pSort->m_idx] = result;
1336+
1337+
// Have too many pending bytes on this connection
1338+
if ( result == -k_EResultLimitExceeded )
1339+
{
1340+
// If caller wants to know - mark all next messages as k_EResultLimitExceeded so caller could
1341+
// attempt to resend them later
1342+
if ( pOutMessageNumberOrResult ) {
1343+
++pSort; // Already done
1344+
for ( ; pSort < pSortEnd ; ++pSort )
1345+
{
1346+
if ( pSort->m_hConn != hConn )
1347+
break;
1348+
1349+
pOutMessageNumberOrResult[pSort->m_idx] = -k_EResultLimitExceeded;
1350+
}
1351+
}
1352+
else
1353+
{
1354+
// Caller doesn't care - just skip this one
1355+
pMsg->Release();
1356+
}
1357+
}
13361358
}
13371359

13381360
// Flush out last connection, if any

src/steamnetworkingsockets/clientlib/steamnetworkingsockets_snp.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -317,7 +317,8 @@ int64 CSteamNetworkConnectionBase::SNP_SendMessage( CSteamNetworkingMessage *pSe
317317
if ( m_senderState.PendingBytesTotal() + cbData > m_connectionConfig.m_SendBufferSize.Get() )
318318
{
319319
SpewWarningRateLimited( usecNow, "Connection already has %u bytes pending, cannot queue any more messages\n", m_senderState.PendingBytesTotal() );
320-
pSendMessage->Release();
320+
// NOTE: @LowKick: we should keep the message around, but not send it, so caller can retry later
321+
// pSendMessage->Release();
321322
return -k_EResultLimitExceeded;
322323
}
323324

tests/test_connection.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1103,6 +1103,7 @@ void Test_netloopback_throughput()
11031103
SteamNetworkingSockets()->SendMessages( 1, &pSendMsg, &nMsgNumberOrResult );
11041104
if ( nMsgNumberOrResult == -k_EResultLimitExceeded )
11051105
{
1106+
pSendMsg->Release();
11061107
TEST_Printf( "SendMessage returned limit exceeded trying to queue %d + %d = %d\n", serverStatus.m_cbPendingReliable, cbSendMsg, serverStatus.m_cbPendingReliable + cbSendMsg );
11071108
break;
11081109
}

0 commit comments

Comments
 (0)