From acb999a881ba108bfe69ee81b8e03dfa6581542e Mon Sep 17 00:00:00 2001 From: wangfq Date: Fri, 3 Jul 2026 16:10:52 +0800 Subject: [PATCH] =?UTF-8?q?fix:=20=E6=94=BE=E5=BC=83=20close+recreate=20li?= =?UTF-8?q?sten=20socket,=20=E6=94=B9=E4=B8=BA=E5=8F=AA=E5=85=B3=E6=95=B0?= =?UTF-8?q?=E6=8D=AEsocket?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 根因: WCHNET ERR_ISCONN(0x1D), listen socket 关闭后端口5960仍被占用, 无法在同端口立即重建. WCHNET_MainTask 循环也未能释放. 新方案: tcp_json_restart 只关数据 socket(N+1) 断开客户端, listen socket(N) 保持不动, 仅重置应用层状态. 新客户端连接时 CONNECT 事件照常触发. --- .../APP/tcp_json_srv.c | 28 +++++-------------- 1 file changed, 7 insertions(+), 21 deletions(-) diff --git a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/tcp_json_srv.c b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/tcp_json_srv.c index d733f99..a5bf261 100644 --- a/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/tcp_json_srv.c +++ b/vd960DBN/BLE/OnlyUpdateApp_Peripheral/APP/tcp_json_srv.c @@ -794,39 +794,25 @@ static void json_sensor_callback(const uint8_t *pkg, uint16_t len) *===========================================================================*/ void tcp_json_restart(void) { - PRINT("JSON: === auto-restart (count=%d) ===\n", g_json_restart_count); + PRINT("JSON: === restart (count=%d) ===\n", g_json_restart_count); - /* 1. 关闭数据 socket 和监听 socket */ + /* + * WCHNET 限制: listen socket 关闭后无法在同端口立即重建 (ERR_ISCONN). + * 因此只关数据 socket 断开客户端, listen socket 保持不变. + */ if (g_json_socket_listen != 0xFF) { WCHNET_SocketClose(g_json_socket_listen + 1, TCP_CLOSE_NORMAL); - WCHNET_SocketClose(g_json_socket_listen, TCP_CLOSE_NORMAL); - g_json_socket_listen = 0xFF; } - /* 1.5 WCHNET 资源回收 — SocketClose 是异步的, 需跑一轮 MainTask */ - { - uint8_t _retry; - for (_retry = 0; _retry < 5; _retry++) { - WCHNET_MainTask(); - if (WCHNET_QueryGlobalInt()) { - WCHNET_HandleGlobalInt(); - } - Delay_Ms(10); - } - } - - /* 2. 重置状态 */ + /* 重置应用层状态 — listen socket 继续监听 */ g_json_auth_state = JSON_STATE_WAIT_AUTH; g_json_pwd_retry = 0; g_json_recv_len = 0; g_json_last_comm_ts = 0; g_json_last_connect_ts = 0; - g_json_auth_timer = 0; + g_json_auth_timer = mstick(); // 从此刻重新计时 g_json_lockout_timer = 0; g_json_pending.active = 0; - - /* 3. 重新创建 socket 并监听 */ - tcp_json_srv_init(); } #define TCP_JSON_SRV_INIT_MAX_RETRY 3