Added simple rate limiting of packets
This commit is contained in:
parent
033a9aa1a8
commit
3ee3f3e5bd
|
@ -0,0 +1,33 @@
|
||||||
|
#!/bin/bash
|
||||||
|
set -e
|
||||||
|
if [ $# -eq 0 ]; then
|
||||||
|
make BETTERCAMERA=1 NODRAWINGDISTANCE=1 DEBUG=1 IMMEDIATELOAD=1 DEVELOPMENT=1 STRICT=1 -j
|
||||||
|
else
|
||||||
|
make BETTERCAMERA=1 NODRAWINGDISTANCE=1 DEBUG=1 IMMEDIATELOAD=1 DEVELOPMENT=1 -j
|
||||||
|
fi
|
||||||
|
|
||||||
|
# find file
|
||||||
|
FILE=./build/us_pc/sm64.us.f3dex2e.exe
|
||||||
|
if [ ! -f "$FILE" ]; then
|
||||||
|
FILE=./build/us_pc/sm64.us.f3dex2e
|
||||||
|
fi
|
||||||
|
|
||||||
|
$FILE --server 27015 --configfile sm64config_p1.txt &
|
||||||
|
sleep 4
|
||||||
|
$FILE --client 127.0.0.1 27015 --configfile sm64config_p2.txt &
|
||||||
|
sleep 2
|
||||||
|
$FILE --client 127.0.0.1 27015 --configfile sm64config_p3.txt &
|
||||||
|
sleep 2
|
||||||
|
$FILE --client 127.0.0.1 27015 --configfile sm64config_p4.txt &
|
||||||
|
sleep 2
|
||||||
|
$FILE --client 127.0.0.1 27015 --configfile sm64config_p5.txt &
|
||||||
|
sleep 2
|
||||||
|
$FILE --client 127.0.0.1 27015 --configfile sm64config_p6.txt &
|
||||||
|
sleep 2
|
||||||
|
$FILE --client 127.0.0.1 27015 --configfile sm64config_p7.txt &
|
||||||
|
sleep 2
|
||||||
|
$FILE --client 127.0.0.1 27015 --configfile sm64config_p8.txt &
|
||||||
|
|
||||||
|
#sleep 2
|
||||||
|
#winpty cgdb $FILE -ex 'break debug_breakpoint_here' -ex 'run --server 27015 --configfile sm64config_p1.txt' -ex 'quit'
|
||||||
|
#winpty cgdb $FILE -ex 'break debug_breakpoint_here' -ex 'run --client 127.0.0.1 27015 --configfile sm64config_p4.txt' -ex 'quit'
|
|
@ -25,6 +25,7 @@ struct NetworkSystem* gNetworkSystem = &gNetworkSystemSocket;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define LOADING_LEVEL_THRESHOLD 10
|
#define LOADING_LEVEL_THRESHOLD 10
|
||||||
|
#define MAX_PACKETS_PER_SECOND_PER_PLAYER ((u16)70)
|
||||||
|
|
||||||
u16 networkLoadingLevel = 0;
|
u16 networkLoadingLevel = 0;
|
||||||
bool gNetworkAreaLoaded = false;
|
bool gNetworkAreaLoaded = false;
|
||||||
|
@ -169,9 +170,30 @@ void network_send_to(u8 localIndex, struct Packet* p) {
|
||||||
|
|
||||||
assert(p->dataLength < PACKET_LENGTH);
|
assert(p->dataLength < PACKET_LENGTH);
|
||||||
|
|
||||||
|
// rate limit packets
|
||||||
|
bool tooManyPackets = false;
|
||||||
|
int maxPacketsPerSecond = (gNetworkType == NT_SERVER) ? (MAX_PACKETS_PER_SECOND_PER_PLAYER * (u16)network_player_connected_count()) : MAX_PACKETS_PER_SECOND_PER_PLAYER;
|
||||||
|
static int sPacketsPerSecond[MAX_PLAYERS] = { 0 };
|
||||||
|
static clock_t sPacketsPerSecondClock[MAX_PLAYERS] = { 0 };
|
||||||
|
clock_t currentClock = clock();
|
||||||
|
if ((currentClock - sPacketsPerSecondClock[localIndex]) > CLOCKS_PER_SEC) {
|
||||||
|
if (sPacketsPerSecond[localIndex] > maxPacketsPerSecond) {
|
||||||
|
LOG_ERROR("Too many packets sent to localIndex %d! Attempted %d. Connected count %d.", localIndex, sPacketsPerSecond[localIndex], network_player_connected_count());
|
||||||
|
}
|
||||||
|
sPacketsPerSecondClock[localIndex] = currentClock;
|
||||||
|
sPacketsPerSecond[localIndex] = 1;
|
||||||
|
} else {
|
||||||
|
sPacketsPerSecond[localIndex]++;
|
||||||
|
if (sPacketsPerSecond[localIndex] > maxPacketsPerSecond) {
|
||||||
|
tooManyPackets = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// send
|
// send
|
||||||
int rc = gNetworkSystem->send(localIndex, p->buffer, p->cursor + sizeof(u32));
|
if (!tooManyPackets) {
|
||||||
if (rc == SOCKET_ERROR) { LOG_ERROR("send error %d", rc); return; }
|
int rc = gNetworkSystem->send(localIndex, p->buffer, p->cursor + sizeof(u32));
|
||||||
|
if (rc == SOCKET_ERROR) { LOG_ERROR("send error %d", rc); return; }
|
||||||
|
}
|
||||||
p->sent = true;
|
p->sent = true;
|
||||||
|
|
||||||
gNetworkPlayers[localIndex].lastSent = clock();
|
gNetworkPlayers[localIndex].lastSent = clock();
|
||||||
|
|
Loading…
Reference in New Issue