diff --git a/developer/proto-8.sh b/developer/proto-8.sh new file mode 100644 index 00000000..84977655 --- /dev/null +++ b/developer/proto-8.sh @@ -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' diff --git a/src/pc/network/network.c b/src/pc/network/network.c index cacfb10b..d044f167 100644 --- a/src/pc/network/network.c +++ b/src/pc/network/network.c @@ -25,6 +25,7 @@ struct NetworkSystem* gNetworkSystem = &gNetworkSystemSocket; #endif #define LOADING_LEVEL_THRESHOLD 10 +#define MAX_PACKETS_PER_SECOND_PER_PLAYER ((u16)70) u16 networkLoadingLevel = 0; bool gNetworkAreaLoaded = false; @@ -169,9 +170,30 @@ void network_send_to(u8 localIndex, struct Packet* p) { 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 - int rc = gNetworkSystem->send(localIndex, p->buffer, p->cursor + sizeof(u32)); - if (rc == SOCKET_ERROR) { LOG_ERROR("send error %d", rc); return; } + if (!tooManyPackets) { + 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; gNetworkPlayers[localIndex].lastSent = clock();