diff --git a/Drivers/BSP/NET/lftpd/lftpd.c b/Drivers/BSP/NET/lftpd/lftpd.c index 35658f96..1e5e5f60 100644 --- a/Drivers/BSP/NET/lftpd/lftpd.c +++ b/Drivers/BSP/NET/lftpd/lftpd.c @@ -623,7 +623,10 @@ cleanup: lftpd_inet_close(client->data_socket); client->data_socket = -1; } - lftpd_inet_close(client->socket); + /* 控制通道不得 close:单连接模型下它即监听器(fd 与监听一体),EOF/断连时 + * net 层已 auto_relisten 回 LISTEN;此处 close 会连监听一起毁掉并触发 + * close→重建竞态(2026-09-24 台架 F1:快速重连在芯片沉降窗内被拒)。 + * 直接返回外层循环,在同一监听 fd 上再次 accept。 */ return 0; } @@ -633,14 +636,23 @@ int lftpd_start(const char *directory, int port, lftpd_t *lftpd) lftpd->directory = directory; lftpd->port = port; + lftpd->server_socket = -1; /* memset 清零后显式置"无监听器"(0 是合法 fd) */ while (true) { - lftpd->server_socket = lftpd_inet_listen(port); if (lftpd->server_socket < 0) { - lftpd_log_error("error creating listener"); - vTaskDelay(pdMS_TO_TICKS(3000)); - continue; + /* 首次启动 / 网络重建后:全量创建监听器(socket+bind+listen) */ + lftpd->server_socket = lftpd_inet_listen(port); + if (lftpd->server_socket < 0) { + lftpd_log_error("error creating listener"); + vTaskDelay(pdMS_TO_TICKS(3000)); + continue; + } } + /* 后续会话:单连接模型下控制通道 fd 即监听器 fd,会话断连后 net 层已 + * auto_relisten 回 LISTEN(同 fd,实测 ~50ms,D10 机制),直接复用; + * 不得 close→重建——close 会毁掉已就绪的监听器,重建的 open 落在芯片 + * 沉降窗内返回假 OK → 窗内快速重连被拒(2026-09-24 台架 F1 发现; + * 铁律:EOF 时应用层不得 net_close 监听 fd)。 */ lftpd_log_info("waiting for connection..."); @@ -648,6 +660,7 @@ int lftpd_start(const char *directory, int port, lftpd_t *lftpd) if (client_socket < 0) { lftpd_log_error("error accepting client socket"); lftpd_inet_close(lftpd->server_socket); + lftpd->server_socket = -1; /* 监听器已不可用(网络重建):下轮重建 */ continue; } @@ -677,8 +690,8 @@ int lftpd_start(const char *directory, int port, lftpd_t *lftpd) handle_control_channel(&client); lftpd->client = NULL; - /* standalone mode: socket was closed in handle_control_channel, - * loop back to create a new listener */ + /* 控制 Socket 不关闭:断连时 net 层已 auto_relisten(同 fd), + * 外层循环直接复用同一监听 fd 再次 accept */ } } diff --git a/Drivers/BSP/NET/net_socket.c b/Drivers/BSP/NET/net_socket.c index 58931110..3682c479 100644 --- a/Drivers/BSP/NET/net_socket.c +++ b/Drivers/BSP/NET/net_socket.c @@ -1571,6 +1571,9 @@ static void net_relisten_clear(int sockfd) { s_relisten_dead[sockfd] = 0U; s_relisten_settle_dead[sockfd] = 0U; /* Trap 23:一并清沉降/隔离状态 */ s_relisten_settle_start[sockfd] = 0U; + s_relisten_quarantine[sockfd] = 0U; /* 一并清隔离标志:关闭/重建即确定性释放, + * 防同 fd 下一生成继承上轮的 400/800ms + * 隔离等待(2026-09-24 台架发现跨轮残留) */ } /*