From c075cfa076903fdd615838391906f2ae25758945 Mon Sep 17 00:00:00 2001 From: Wanderingss <1624155937@qq.com> Date: Thu, 24 Sep 2026 22:49:33 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E5=A4=8DF1=EF=BC=9Alftpd=E4=BC=9A?= =?UTF-8?q?=E8=AF=9D=E7=BB=93=E6=9D=9F=E5=A4=8D=E7=94=A8auto=5Frelisten?= =?UTF-8?q?=E7=9B=91=E5=90=AC=E5=99=A8=E4=B8=8D=E5=86=8D=E5=85=B3=E9=97=AD?= =?UTF-8?q?=E6=8E=A7=E5=88=B6=E7=9B=91=E5=90=AC=EF=BC=8Cnet=E5=85=B3?= =?UTF-8?q?=E9=97=AD=E6=97=B6=E6=B8=85=E9=9A=94=E7=A6=BB=E6=A0=87=E5=BF=97?= =?UTF-8?q?=E9=98=B2=E8=B7=A8=E8=BD=AE=E6=AE=8B=E7=95=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Drivers/BSP/NET/lftpd/lftpd.c | 27 ++++++++++++++++++++------- Drivers/BSP/NET/net_socket.c | 3 +++ 2 files changed, 23 insertions(+), 7 deletions(-) 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 台架发现跨轮残留) */ } /*