From 50ca869180b24021c81bda5924a0128418190f34 Mon Sep 17 00:00:00 2001 From: Eddyadame Date: Wed, 15 Jul 2026 11:00:25 -0500 Subject: [PATCH] Added prints to verify Client connections and debugging prints --- main/main.c | 156 +++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 117 insertions(+), 39 deletions(-) diff --git a/main/main.c b/main/main.c index 7b1c59d..7575120 100644 --- a/main/main.c +++ b/main/main.c @@ -17,6 +17,7 @@ #include "esp_spiffs.h" #include "esp_heap_caps.h" #include "esp_timer.h" +#include "sdkconfig.h" #include "lwip/sockets.h" #include "lwip/netdb.h" @@ -45,6 +46,57 @@ typedef struct static volatile int g_active_modbus_clients = 0; +/* + * Socket diagnostics are intentionally event-driven so the terminal stays quiet. + * A summary is printed only when the server starts, a client connects or + * disconnects, or accept() fails. + */ +static int count_active_client_slots(const int client_socks[], uint8_t max_clients) +{ + int active = 0; + + if (client_socks == NULL) + return 0; + + for (uint8_t i = 0; i < max_clients; i++) + { + if (client_socks[i] >= 0) + active++; + } + + return active; +} + +static void log_socket_summary(const char *event, + int listen_sock, + const int client_socks[], + uint8_t max_clients, + int event_sock, + int event_errno) +{ + const int active = count_active_client_slots(client_socks, max_clients); + + if (event_errno != 0) + { + ESP_LOGW(TAG, + "Socket status [%s]: listen_sock=%d event_sock=%d active=%d/%u " + "lwip_max=%d free_heap=%u errno=%d (%s)", + event, listen_sock, event_sock, active, (unsigned)max_clients, + CONFIG_LWIP_MAX_SOCKETS, + (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT), + event_errno, strerror(event_errno)); + } + else + { + ESP_LOGI(TAG, + "Socket status [%s]: listen_sock=%d event_sock=%d active=%d/%u " + "lwip_max=%d free_heap=%u", + event, listen_sock, event_sock, active, (unsigned)max_clients, + CONFIG_LWIP_MAX_SOCKETS, + (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT)); + } +} + typedef struct { uint8_t unit_id; @@ -285,20 +337,33 @@ static void modbus_client_task(void *arg) vTaskDelete(NULL); } -static void close_client_slot(int client_socks[], struct sockaddr_in client_addrs[], int index) +static void close_client_slot(int listen_sock, + int client_socks[], + struct sockaddr_in client_addrs[], + uint8_t max_clients, + int index) { if (client_socks[index] >= 0) { + const int closed_sock = client_socks[index]; + ESP_LOGI(TAG, "Client disconnected: %s:%d", inet_ntoa(client_addrs[index].sin_addr), ntohs(client_addrs[index].sin_port)); - shutdown(client_socks[index], 0); - close(client_socks[index]); + shutdown(closed_sock, 0); + close(closed_sock); client_socks[index] = -1; if (g_active_modbus_clients > 0) g_active_modbus_clients--; + + log_socket_summary("client disconnected", + listen_sock, + client_socks, + max_clients, + closed_sock, + 0); } } @@ -367,6 +432,13 @@ static void modbus_server_task(void *arg) (unsigned)g_device_cfg.modbus.port, (unsigned)max_clients); + log_socket_summary("server started", + listen_sock, + client_socks, + max_clients, + -1, + 0); + while (1) { fd_set read_fds; @@ -410,20 +482,25 @@ static void modbus_server_task(void *arg) if (client_sock < 0) { - if (errno == 23 || errno == EMFILE || errno == ENFILE || errno == ENOMEM) - { - ESP_LOGW(TAG, - "accept failed: socket resources exhausted errno=%d active=%d max=%u; backing off", - errno, - g_active_modbus_clients, - (unsigned)max_clients); - - vTaskDelay(pdMS_TO_TICKS(500)); + const int accept_errno = errno; + /* One concise diagnostic line per failed accept. */ + log_socket_summary("accept failed", + listen_sock, + client_socks, + max_clients, + -1, + accept_errno); + + if (accept_errno == 23 || + accept_errno == EMFILE || + accept_errno == ENFILE || + accept_errno == ENOMEM) + { + vTaskDelay(pdMS_TO_TICKS(500)); } else { - ESP_LOGW(TAG, "accept failed: errno=%d", errno); vTaskDelay(pdMS_TO_TICKS(50)); } } @@ -460,6 +537,13 @@ static void modbus_server_task(void *arg) inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port), g_active_modbus_clients); + + log_socket_summary("client connected", + listen_sock, + client_socks, + max_clients, + client_sock, + 0); } } } @@ -481,14 +565,14 @@ static void modbus_server_task(void *arg) ntohs(client_addrs[i].sin_port), errno); - close_client_slot(client_socks, client_addrs, i); + close_client_slot(listen_sock, client_socks, client_addrs, max_clients, i); client_last_seen[i] = 0; continue; } if (len == 0) { - close_client_slot(client_socks, client_addrs, i); + close_client_slot(listen_sock, client_socks, client_addrs, max_clients, i); client_last_seen[i] = 0; continue; } @@ -541,7 +625,7 @@ static void modbus_server_task(void *arg) ntohs(client_addrs[i].sin_port), errno); - close_client_slot(client_socks, client_addrs, i); + close_client_slot(listen_sock, client_socks, client_addrs, max_clients, i); continue; } } @@ -555,7 +639,7 @@ static void modbus_server_task(void *arg) inet_ntoa(client_addrs[i].sin_addr), ntohs(client_addrs[i].sin_port)); - close_client_slot(client_socks, client_addrs, i); + close_client_slot(listen_sock, client_socks, client_addrs, max_clients, i); client_last_seen[i] = 0; } } @@ -883,6 +967,10 @@ void app_main(void) ESP_LOGI(TAG, "Modbus Port: %u", (unsigned)g_device_cfg.modbus.port); ESP_LOGI(TAG, "Configured device_count = %u", (unsigned)g_device_cfg.modbus.device_count); ESP_LOGI(TAG, "Configured max_points per device = %u", (unsigned)g_device_cfg.modbus.max_points); + ESP_LOGI(TAG, + "Socket configuration: configured_modbus_clients=%u lwip_max_sockets=%d", + (unsigned)g_device_cfg.modbus.max_clients, + CONFIG_LWIP_MAX_SOCKETS); for (i = 0; i < g_device_cfg.modbus.device_count; i++) { @@ -955,11 +1043,10 @@ void app_main(void) if (dev == NULL) { ESP_LOGE(TAG, - "Failed to allocate Modbus device %u: size=%u free_heap=%u largest_block=%u", + "Failed to allocate Modbus device %u: size=%u free_heap=%u", (unsigned)(i + 1U), (unsigned)sizeof(modbus_device_t), - (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT), - (unsigned)heap_caps_get_largest_free_block(MALLOC_CAP_8BIT)); + (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT)); continue; } @@ -1060,18 +1147,14 @@ void app_main(void) size_t total_points_remaining = 0; size_t free_heap = heap_caps_get_free_size(MALLOC_CAP_8BIT); - size_t largest_block = heap_caps_get_largest_free_block(MALLOC_CAP_8BIT); - size_t point_struct_size = sizeof(modbus_point_t); size_t configured_points_per_device = g_device_cfg.modbus.max_points; size_t configured_db_bytes_per_device = configured_points_per_device * point_struct_size; size_t estimated_additional_devices_free_heap = 0; - size_t estimated_additional_devices_largest_block = 0; if (configured_db_bytes_per_device > 0U) { estimated_additional_devices_free_heap = free_heap / configured_db_bytes_per_device; - estimated_additional_devices_largest_block = largest_block / configured_db_bytes_per_device; } for (i = 0; i < g_device_count; i++) @@ -1116,14 +1199,12 @@ void app_main(void) (unsigned)configured_db_bytes_per_device); ESP_LOGI(TAG, - "Free heap=%u bytes, largest block=%u bytes", - (unsigned)free_heap, - (unsigned)largest_block); + "Free heap=%u bytes", + (unsigned)free_heap); ESP_LOGI(TAG, - "Estimated additional devices possible with current max_points: free_heap=%u, largest_block=%u", - (unsigned)estimated_additional_devices_free_heap, - (unsigned)estimated_additional_devices_largest_block); + "Estimated additional devices possible with current max_points: %u", + (unsigned)estimated_additional_devices_free_heap); } ESP_LOGI(TAG, "---------------------------------"); @@ -1223,9 +1304,8 @@ void app_main(void) if (server_ok != pdPASS) { ESP_LOGE(TAG, - "Failed to create modbus_server_task: free_heap=%u largest_block=%u", - (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT), - (unsigned)heap_caps_get_largest_free_block(MALLOC_CAP_8BIT)); + "Failed to create modbus_server_task: free_heap=%u", + (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT)); return; } @@ -1239,15 +1319,13 @@ void app_main(void) if (override_ok != pdPASS) { ESP_LOGE(TAG, - "Failed to create modbus_override_task: free_heap=%u largest_block=%u", - (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT), - (unsigned)heap_caps_get_largest_free_block(MALLOC_CAP_8BIT)); + "Failed to create modbus_override_task: free_heap=%u", + (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT)); return; } ESP_LOGI(TAG, - "Modbus tasks started: free_heap=%u largest_block=%u", - (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT), - (unsigned)heap_caps_get_largest_free_block(MALLOC_CAP_8BIT)); + "Modbus tasks started: free_heap=%u", + (unsigned)heap_caps_get_free_size(MALLOC_CAP_8BIT)); } \ No newline at end of file