commit f3fbde3134fce52d2d09c4ef1de3ba0372bbb171 from: p2r3 date: Sat Aug 30 21:01:35 2025 UTC terminate connections on long network timeouts commit - 7d390ed8992106bf3574f65f7fe6ca195c208d07 commit + f3fbde3134fce52d2d09c4ef1de3ba0372bbb171 blob - e2ed5cdc821597ddd5b60cc8982aa42cbd19135a blob + 4c97b61a48c1358cebde4b6afd7a670cbb634740 --- include/procedures.h +++ include/procedures.h @@ -15,6 +15,7 @@ void resetPlayerData (PlayerData *player); int reservePlayerData (int client_fd, uint8_t *uuid, char* name); int getPlayerData (int client_fd, PlayerData **output); void handlePlayerDisconnect (int client_fd); +void disconnectClient (int *client_fd, int cause); int givePlayerItem (PlayerData *player, uint16_t item, uint8_t count); void spawnPlayer (PlayerData *player); blob - b4e9accd02c29f4a684a0a82f6f087ee5cc71dad blob + d3f9bba7c4011521fbfc70eb86e46f9789e75421 --- src/main.c +++ src/main.c @@ -444,16 +444,6 @@ void handlePacket (int client_fd, int length, int pack } -void disconnectClient (int *client_fd, int cause) { - if (*client_fd == -1) return; - client_count --; - setClientState(*client_fd, STATE_NONE); - handlePlayerDisconnect(*client_fd); - close(*client_fd); - *client_fd = -1; - printf("Disconnected client %d, cause: %d, errno: %d\n\n", *client_fd, cause, errno); -} - int main () { // Hash the seeds to ensure they're random enough @@ -655,6 +645,7 @@ void wifi_init () { esp_wifi_set_mode(WIFI_MODE_STA); esp_wifi_set_config(WIFI_IF_STA, &wifi_config); + esp_wifi_set_ps(WIFI_PS_NONE); esp_wifi_start(); } blob - eee26a4879930f6a28e98d11aab4a2d9b8938fd0 blob + e341cd4362eb8db374d2b528086c6dee93389072 --- src/procedures.c +++ src/procedures.c @@ -1,6 +1,7 @@ #include #include #include +#include #include "globals.h" #include "tools.h" @@ -145,6 +146,16 @@ void handlePlayerDisconnect (int client_fd) { } } +void disconnectClient (int *client_fd, int cause) { + if (*client_fd == -1) return; + client_count --; + setClientState(*client_fd, STATE_NONE); + handlePlayerDisconnect(*client_fd); + close(*client_fd); + *client_fd = -1; + printf("Disconnected client %d, cause: %d, errno: %d\n\n", *client_fd, cause, errno); +} + uint8_t serverSlotToClientSlot (int window_id, uint8_t slot) { if (window_id == 0) { // player inventory blob - 33d35baf4b86052e1919bf7e25e1598d66172036 blob + 24a023a828bdd5f9aa5ab7ce054a9e650b13ed0f --- src/tools.c +++ src/tools.c @@ -17,6 +17,7 @@ #include "globals.h" #include "varnum.h" +#include "procedures.h" #include "tools.h" static uint64_t htonll (uint64_t value) { @@ -57,7 +58,10 @@ ssize_t recv_all (int client_fd, void *buf, size_t n, if (r < 0) { if (errno == EAGAIN || errno == EWOULDBLOCK) { // handle network timeout - if (get_program_time() - last_update_time > NETWORK_TIMEOUT_TIME) return -1; + if (get_program_time() - last_update_time > NETWORK_TIMEOUT_TIME) { + disconnectClient(&client_fd, -1); + return -1; + } task_yield(); continue; } else { @@ -101,7 +105,10 @@ ssize_t send_all (int client_fd, const void *buf, ssiz // not yet ready to transmit, try again if (errno == EINTR || errno == EAGAIN || errno == EWOULDBLOCK) { // handle network timeout - if (get_program_time() - last_update_time > NETWORK_TIMEOUT_TIME) return -1; + if (get_program_time() - last_update_time > NETWORK_TIMEOUT_TIME) { + disconnectClient(&client_fd, -2); + return -1; + } task_yield(); continue; }