修复F1:lftpd会话结束复用auto_relisten监听器不再关闭控制监听,net关闭时清隔离标志防跨轮残留
This commit is contained in:
@@ -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 */
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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 台架发现跨轮残留) */
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user